【转】深度解密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

关于服务目录框架的一些思考

2019-06-02 16:03:32

陆陆续续使用Go来进行日常业务服务开发有段时间了,慢慢有了一些心得,也在往这些方面进行靠拢。 清晰的文件目录 我们在进行服务开发过程中,往往不是一个人在那战斗,而是一个团队。应该说,对于稍具规模的公司在这个方面都是相当看重的。因为清晰的目录结构、文件命名等体现一个团队的素养,一定程度上降低项目维护成本。比如在A同事接手B同事项目时能够做到尽量快的接手。 下面是我们现有服务的一个目录结构 展开查看 . ├── config │   └── dev.conf ├── constants │   ├── errors │   └── types ├── global │   ├── config.go │   └── config_watcher.go ├── main.go ├── modules │   └── doc.go ├── routes │   └── root.go └── vendor    └── ... 当前主要的目录结构就是以上的几个: config:顾名思义,就是存放的本地想相关配置文件,我们配置文件主要以json为主 constants:存放的是一些全局宏定义,比如定义的通用错误放errors,通用全局控制放types global:初始化配置文件的地方,从本地or远端配置服务拉取出来的配置均在此处进行初始化 modules:一些模块化定义的地方,

谷歌浏览器模拟手机浏览器

2019-05-12 16:08:46

构建初始化环境 下载谷歌浏览器,地址:https://www.google.com/chrome/#_ga=2.207613393.314015719.1537268086-901043581.1537268086 不能下载?点击这里 构建基本环境 浏览地址先输入网址 如神马搜索:https://yz.m.sm.cn/s?q=红岩&from=wy836274&by=submit&snum=4 UA更换 Mozilla/5.0 (Linux; U; Android 7.1.1; zh-cn; OPPO R11s Build/

【译】调试使用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化的配置,

201904读书会

2019-04-12 12:06:06

《永乐大帝朱棣》 状态:100% finished 毛佩琦的一本老书,断断续续看完差不多前后花了有两个月。历朝历代,君王上纲上线要么子承父业,要么是抢过来的。朱棣也不例外,朱棣是洪武帝的第四个儿子,也是朱元璋最喜欢的一个儿子,能打仗,有谋略,敢下手,缺偏偏因历史原因需要将太子传给儿子中的老大朱标,朱标因年早逝又传给世子朱允炆,抢夺帝位就此开始。 建文元年,朱允炆主张仁治,在黄子澄等一干人帮助下进行了削藩,这就成功触碰到了朱棣的神经,生死存亡,于是打起了靖难的旗号起兵反抗,起兵过程中往往应征了运气也是实力的一部分,在老天爷多次帮忙下活了过来且越来越壮大,最终如常所愿。一幕幕的战争场面也能实时的映入眼帘。 一朝天子一朝臣,新帝上任,旧臣下课(往往是被诛杀),同朱元璋称帝一样,作为皇帝往往为了免除后患,都会大肆进行杀戮,这就是朝廷和政治的斗争,为财为权,不管经历多少年,这都是利益使然,如今社会也一样。 朱允炆从此开始了十六年的逃亡生活,隐姓埋名,却成了朱棣的一大心病,因为活不见人死不见尸,这个后患一直未被根除。直到自己快寿终前才得知朱允炆的去世,了却了心愿。 朱棣这个人,不能说好,也不能说坏,

Data too long for column

2019-04-04 10:02:43

背景 最近在对MySQL进行一个常见的数据插入的时候,报了一个Data too long for column xxx的错误,当时就有点懵,首先我存放的这个字段里面内容可能会比较大,当初我就设置为TEXT类型,按理说用这个类型来存放已经足够,就不会报这个问题才对 解决办法 varchar 如果原本定义的字段类型为varchar类型,应该是你存放的数据超过了设置的长度,两种方式: 把varchar设置更大值 将MySQL模式设置为非严格模式(这个主要是由低版本的MySQL转高版本MySQL导致,比如数据迁移时) SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; text 而我此次出的问题就是这个,本想text类型已经够存放,但第三方存放的数据大小往往会是不可控的,需要将原有的TEXT改为MEDIUMTEXT,当然具体大小怎么更改需要看你具体业务需求,不是越大越好。我们可以看下面的定义: 类型 大小 TINYTEXT 256 bytes TEXT 65,535 bytes

Jetbrains系列激活方法(2018.3最新)

2019-03-15 12:58:40

声明 我只是工具的搬运工,原始地址:https://zhile.io/2018/08/22/jetbrains-license-server-crack.html 感谢他们的付出,为防止下载包出现问题,我这里也提供几个版本的下载地址 下载 jetbrains-agent-v2018.2.2.zip jetbrains-agent-lastest.zip 激活方式 下载下来后,解压压缩包,你自然就知道了 注 破解方法请勿商用! 破解方法请勿商用! 破解方法请勿商用!

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工具,