Web Analytics

记一次go panic问题的解决过程

一. Panic问题概述 本周收到客户在bugclose上填写的一个issue:添加一个下发通道后,pushd程序panic并退出了!程序panic时输出的stacktrace信息摘录如下: ...

April 4, 2019 · 7 min · Tony Bai

写Go代码时遇到的那些问题[第3期]

我有一个习惯,那就是随时记录下编程过程中遇到的问题(包括问题现场、问题起因以及对问题的分析),并喜欢阶段性的对一段时间内的编码过程的得与失进行回顾和总结。内容可以包括:对编程语法的新认知、遇坑填坑的经历、一些让自己豁然开朗的小tip/小实践等。记录和总结的多了,感觉有价值的,就成文发在博客上的;一些小的点,或是还没有想清楚的事情,或思路没法结构化统一的,就放在资料库里备用。“写Go代码时遇到的那些问题”这个系列也是基于这个思路做的。 ...

April 6, 2018 · 17 min · Tony Bai

defer函数参数求值简要分析

一. 引子 书接上文,在发表了《对一段Go语言代码输出结果的简要分析》一文之后,原问题提出者又有了新问题,这是一个典型Gopher学习Go的历程,想必很多Gopher们,包括我自己都遇到过的。我们先来看看这段代码(来自原问题提出者): // https://play.golang.org/p/dOUFNj96EIQ package main import "fmt" func main() { var i int = 1 defer fmt.Println("result =>",func() int { return i * 2 }()) i++ } 这里显然有坑!初学者的常规逻辑一般是:defer是在main函数退出后执行,退出前i已经做了+1操作,值变成了2,这样一来defer后的Println应该输出:result => 4 才对!实际输出结果呢? ...

March 23, 2018 · 5 min · Tony Bai

对一段Go语言代码输出结果的简要分析

年后事情实在是多,各种被催进度,于是好长一段时间未更博客了,自责中….。今天蹦出来热热身^0^! 中午在微博私信中看到一封来自某Gopher的咨询,他贴了一段代码,并表示对代码的输出结果的不解,希望我能帮他分析一下。他的代码如下: ...

March 20, 2018 · 4 min · Tony Bai

Go 1.10中值得关注的几个变化

又到了Go语言新版本的发布时间窗口了!这次的主角是Go 1.10。 曾几何时, 这是很多Gopher在Go 1.8、Go 1.9时猜测是否存在的那个版本,毕竟minor version即将进化到两位数。从Go语言第一封设计mail发出到现在的十年间,尤其是Go语言经历了近几年的爆发式增长,基本奠定了云原生第一语言的位置之后,人们对Go语言有了更多新的、更为深刻的认知,同时对这门编程语言也有了更多的改进和优化的期望。Go2在Gopher心中的位置日益提升,直到Russ Cox在GopherCon 2017上公布了Go core team对Go2的开发策略,我们才意识到:哦,Go1还将继续一段时间,甚至是一段很长的时间。2018年2月,我们将迎来Go 1.10版本。 ...

February 17, 2018 · 23 min · Tony Bai

Go 1.8中值得关注的几个变化

在已经过去的2016年,Go语言继在2009年之后再次成为编程语言界的明星- 问鼎TIOBE 2016年度语言。这与Go team、Go community和全世界的Gophers的努力是分不开的。按计划在这个2月份,Go team将正式发布Go 1.8版本(截至目前,Go的最新版本是Go 1.8rc3)。在这里我们一起来看一下在Go 1.8版本中都有哪些值得Gopher们关注的变化。 ...

February 3, 2017 · 19 min · Tony Bai

关于Go,你可能不注意的7件事

Go以简洁著称,但简洁中不乏值得玩味的小细节。这些小细节不如goroutine、interface和channel那样"高大上",“屌 丝"得可能不经常被人注意到,但它们却对理解Go语言有着重要的作用。这里想挑出一些和大家一起通过详实的例子来逐一展开和理解。本文内容较为基础,适合初学者,高手可飘过:) 一、源文件字符集****和字符集编码 Go源码文件默认采用Unicode字符集,Unicode**码点(code point)和内存中字节序列(byte sequence)**的变换实现使用了UTF-8:一种变长多字节编码,同时也是一种事实字符集编码标准,为Linux、MacOSX 上的默认字符集编码,因此使用Linux或MacOSX进行Go程序开发,你会省去很多字符集转换方面的烦恼。但如果你是在Windows上使用 默认编辑器编辑Go源码文本,当你编译以下代码时会遇到编译错误: ...

September 17, 2015 · 20 min · Tony Bai

Go与C语言的互操作

Go有强烈的C背景,除了语法具有继承性外,其设计者以及其设计目标都与C语言有着千丝万缕的联系。在Go与C语言互操作(Interoperability)方面,Go更是提供了强大的支持。尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,这是其他语言所无法望其项背的。 在如下一些场景中,可能会涉及到Go与C的互操作: 1、提升局部代码性能时,用C替换一些Go代码。C之于Go,好比汇编之于C。 2、嫌Go内存GC性能不足,自己手动管理应用内存。 ...

September 26, 2012 · 9 min · Tony Bai

Go中的系统Signal处理

我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出。我们采用系统Signal来 通知系统退出,即kill pragram-pid。我们在程序中针对一些系统信号设置了处理函数,当收到信号后,会执行相关清理程序或通知各个子进程做自清理。kill -9强制杀掉程序是不能被接受的,那样会导致某些处理过程被强制中断,留下无法恢复的现场,导致消息被破坏,影响下次系统启动运行。 ...

September 21, 2012 · 4 min · Tony Bai

Go语言标准库概览

本文翻译自Dr.Dobb’s的"A Brief Tour of the Go Standard Library“一文。 在Go语言五周系列教程的最后一部分中,我们将带领大家一起来浏览一下Go语言丰富的标准库。 Go标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是有选择性的且非常简单。本文发表后,标准库的内容还可能继续增加,因此 建议大家最好是通过在线查阅库API或使用godoc(包含在Go发布包中)来获取最新信息以及全面了解每个包所具备的功能。 ...

September 8, 2012 · 18 min · Tony Bai