【转】深度解密Go语言之context

2019-06-13 16:16:43

最近在公众号【码农桃花源】读到微信一篇关于context的文章,很不错,推荐给大家。原文地址:https://mp.weixin.qq.com/s/GpVy1eB5Cz_t-dhVC6BJNw Go 语言的 context 包短小精悍,非常适合新手学习。不论是它的源码还是实际使用,都值得投入时间去学习。 这篇文章依然想尝试全面、深入地去研究。文章相比往期而言,整体不长,希望你看完可以有所收获! 贴上文章的目录: 什么是context Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、

Golang之HTTP EOF/connection reset by peer详解

2019-06-10 12:18:48

背景 使用net/http同时发起多个简单请求时,偶尔会出现EOF或connect: connection reset by peer的情况。明明就是一个很简单的例子,为何会出现这种情况呢? 举例 这里我为了省事,直接套用网上其他人的客户端的例子: req, err := http.NewRequest(method, url, body) if err !=nil{ return nil, err } resp, err := http.DefaultClient.Do(req) if err !=nil{ return nil, err } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err

【译】调试使用Go1.12开发部署的程序

2019-04-26 14:45:37

源地址:https://blog.golang.org/debugging-what-you-deploy 1. 介绍 Go 1.11和Go 1.12在允许开发人员调试对已部署至生成环境的二进制可执行程序方面取得了重大进展。 由于Go编译器在生成更快的二进制文件方面变得越来越积极,我们在可调试性方面已失去了优势。在Go 1.10中,用户在编译时完全禁用编译优化,才能在使用Delve等交互式工具中获得良好的调试体验。但是用户不应该为了可调试性而降低程序性能,尤其是在生产环境中。如果在生产环境了出现了问题,且需要在生产环境进行debug调试,我们不应该采用未经调优的二进制文件直接放到生产环境中。 对于Go 1.11和1.12,我们专注于提升对已经编译优化后的二进制文件的debug体验(Go编译器的默认设置),改进包括: 更准确的入参(value)检测,特别是function的入参; 更精确的识别语句边界,以便一步一步调试时不那么跳跃,断点能更多的落在调试人员期望的地方; Delve调用Go函数的初步支持(goroutines以及垃圾回收机制使得它比C和C++更复杂) 2. 使用Delve调试优化代码 Delve是基于x86的,支持Linux和MacOS。Delve对Go的goroutines结合比较好,也支持Go的其他功能,能有比较好的调试体验。Delve也是Goland、

Golang之服务配置自动初始化

2019-04-24 16:28:38

背景 今天分享一个利用reflect在实际项目中比较省时、代码简洁且高效的方法-服务配置自动初始化的方法。 我们在起一个Web项目时,常常都是直接使用开源的一些框架或组建,然后在我们自己的项目中要使用之前按照该框架或组建提供的帮助文档一个一个进行相应的初始化配置。也许我们只引用其中一两个,这样写都还能忍受,可是如果这个服务会引用更多的呢? 效果 代码简洁化 接入第三方库就如搭积木一样,模块化,随取随用 可维护性高 干货 下面,我们就来利用reflect实现该功能。 思路 磨刀不误砍柴工,我们先整理好一个简单思路,然后再尝试实现它,这样就简单了。 从远端配置服务或本地获取到我们需要初始化的配置 解析配置中的数据 判断配置中元素是否有实现我们指定方法,如果有就执行它,没有就跳过 没错,用语言描述就这么三句话,就这么简单。 获取配置 服务要启动,获取配置要么从远端配置服务拉取,要么从本地读取,就以常见的json格式作为我们本次举例的配置格式吧。 { "ginx": { "listen_port": 8080 }, "conn_timeout":2 } 既然是json化的配置,

could not launch process: decoding dwarf section info at offset 0x0: too short

2019-03-15 11:44:35

背景 我在使用Goland进行Go的测试用例调试时,发生了could not launch process: decoding dwarf section info at offset 0x0: too short,而在终端中执行go test又能正常执行并打印我们想要的日志 原因 我的开发环境为: Mac OSX Goland:2017.03 go version:v1.11.5 我原本Go语言版本是v1.10,最近对Go的版本进行了升级,直接升级到了v1.11.5。语言版本算是正常升级了,升级语言版本对应的工具也会随着升级的。事实却是:Goland使用的是自己的dlv工具,并没有使用我们自己手动或者通过brew install安装的dlv工具,并且Goland自带的dlv工具在Mac的keychain中应该出现了未授权或者过期的情况,从而导致了以上的报错产生。 解决 解决办法有两种: 直接升级Goland的最新版本,最新版本里面解决了这个问题 如若遇到了更新最近版Goland遇到激活问题,请点击这里 更新dlv工具,

Go zk(zookeeper)服务发现

2019-02-26 14:58:42

简介 zk同etcd一样,存储数据格式均采用key-value类型,而我们在进行微服务开发时,这两者大部分的应用场景都是应用在服务发现以及服务配置上。 流程 基于zk的服务注册与发现大致流程如下: 如:A、B两个服务均在内网环境,A需要向B发起接口调用,A需要从本地的缓存中获取出B对应的调用ip:port信息,然后向B发起调用。A中的缓存是A服务在启动时就开启了一个协成或线程用于从zk中拉取或监听服务数据,而zk的服务数据是通过B在启动时开启了一个TCP长连接向zk进行的服务注册。 实现 整个流程相对简单,以下为服务发现的监听测源码,该源码依赖 github.com/samuel/go-zookeeper package main import ( "fmt" "time" "github.com/samuel/go-zookeeper/zk" ) var ( path = "/entry/test" ) func main() { c, _, err

Docker之镜像创建及部署

2019-02-20 23:33:56

上篇文章提到了一些简单的docker命令,这里主要展示一下我们如何将我们需要的服务利用docker一步一步把它跑起来,文章内容不够全面,仅供学习参考使用。 穿梭门:Docker之常用命令 尝鲜 我们可以从最简单的Hello World开始,感受一下Docker的运行效果,直接在命令行执行下面的命令,就能从官方仓库中拉取指定名字的镜像。如果拉取的是自己或其他渠道提供的镜像,pull后面带指定路径即可。 docker pull hello-world 拉取成功后执行docker images可以看到拉下来的镜像列表,然后我们直接跑起来 docker run hello-world 输出这段提示后,hello world就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如我们常部署的服务等。 注: docker run命令具有自动抓取image文件的功能,如果发现本地没有指定的image,就会从仓库中自动抓取,也就是前面的docker pull并不是必须的。 正餐 上面的hello-world明显不能满足我们的欲望,我们的实际需求是将我们自己原本跑在VM或物理机上的服务能部署在Docker上面,那我们现在就开始吧。 Dockerfile 要达到我们的目的,不能离开的就是这个Dockerfile文件,Docker是根据该文件来生成二进制的image文件。我们直接使用一个实际的样例来进行讲解,新建一个文件并命名Dockerfile FROM centos RUN

Docker之常用命令

2019-02-19 09:49:39

简介 Docker的命令很多,但根据二八原则,会使用常用的那两层命令足以应付八层场景。 命令 更多命令建议使用docker --help的方式查看,针对某一个具体的command也可以使用docker [CMD] --help的方式查看,命令用法比较详细。 镜像搜索 使用docker search进行镜像资源搜索,搜索来源于镜像仓库,默认是Docker Hub中,国内腾讯云或阿里云均有镜像加速器 docker search [name] 注: NAME:镜像仓库名称。 DESCRIPTION:镜像仓库描述 STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 star OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护 AUTOMATED:表示是否是自动构建的镜像仓库 拉取镜像 从docker仓库中获取指定镜像 docker pull name:[tag] 注: 从仓库中拉取指定的镜像,后面tag为指定镜像版本,也可以不指定,默认为latest

Golang之go get golang.org/x timeout

2018-12-10 14:14:30

背景 使用软件项目开发过程中是离不开开发环境的,而我们的Golang环境更不可能离开golang.org包,但我们在编译或者安装某个包时,常会提示 "golang.org/x/(ooo引用不同包,报的错会不一样)" (https fetch: Get https://golang.org/x/net/(ooo引用不同包,报的错会不一样)?go-get=1: dial tcp 216.239.37.1:443: i/o timeout) 毫无疑问,这是网络问题,这个地址在国内是不能轻易访问而导致下载不了,不知道谷歌老爹在重返China后还会不会有这个情况😆。 解决办法 有问题就有解决办法,毕竟办法总比问题多嘛,哈哈。在Github上面,Golang有个托管地址https://github.com/golang,里面相当于golang.org/

Golang之defer

2018-12-05 22:46:42

背景 defer在golang中属于关键词,主要用于资源释放,会在函数返回之前被调用,但其中也包含了很多的坑。下面我们通过几个常见例子来进行相关的讲解。 例子 // e.g.1 func f1() (r int) { defer func() { r = r + 5 }() return 1 } // e.g.2 func f2() (r int) { t := 5 defer func() { t = t + 5 }() return t } // e.g.3 func f3() (r int) { t := 5 defer func(r int)