golang 面试题整理(七)

答:B答:无限递归循环,栈溢出。解析:知识点:类型的 String() 方法。如果类型定义了 String() 方法,使用 Printf()、Print() 、 Println() 、 Sprintf() 等格式化输出时会自动使用 String() 方法。答:A D解析:全局变量要定义在函数之外,而在函数之外定义的变量只能用 var 定义。短变量声明 := 只能用于函数之内。答:无限递归循环,栈溢出。解析:知识点:WaitGroup 的使用。存在两个问题:修复代码:或者:答:运行时错误解析:知识点:多重赋值。多重赋值分为两个步骤,有先后顺序:答:A解析:Go语言的内存回收机制规定,只要有一个指针指向引用一个变量,那么这个变量就不会被释放(内存逃逸),因此在 Go 语言中返回函数参数或临时变量是安全的。答:输出什么?解析:讨论 #8知识点:数值溢出。当 i 的值为 0、128 是会发生相等情况,注意

golang工具包stringer的使用

Stringer是一个自动化工具,用于生成满足fmt.Stringer接口的方法,主要针对定义了常量(有符号或无符号)整数类型T的名称。它自动创建自包含的Go源文件实现,并与定义T的软件包在同一软件包和目录中创建。Stringer特别适用于连续值的常量,比如使用iota创建的常量,但同样能为其他类型的常量生成良好的代码。未来,它可能为位模式的常量集提供自定义支持。要使用Stringer,首先需手动安装,因为它不是go安装包自带的。注意安装后需要将Stringer所在目录添加到环境变量的path中。使用Stringer的关键参数包括`type`和`文件名`。`type`指定了需要生成的对象,后面加文件名则是指定对象所在的文件名。例如,使用命令`stringer -type=Pill pill.go`,将在同一目录下生成`pill_string.go`文件。生成的代码将包含`String()`方法,用于将Pill常量的值转换为相应常量名称的字符串表示

使用dlv排查Golang程序线上问题的过程及使用记录

最近线上有个服务突然卡死了,看起来是进程启动了,但是请求接口则反应连接不上,看错误日志也没有什么异常信息,对于这种线上服务卡死的问题,一直没有丰富经验来排查。我先是用 strace -p pid 来看问题,发现有时候又处于wait futex,有时候有正常的刷刷刷一大堆信息。按照我之前的经验,出现wait futex,一般是等待channel出现,如果一直处于wait futex,则说明进程卡死在某个channel上了。但是现在这个卡死的进程并没有一直处于wait futex,说明可能不是卡死在某个channel上,至少还有其他goroutine在正常活动中。进程没有卡死在wait futex,但是又不能监听端口处理请求,说明要么是在启动阶段,还未到监听端口这一步就出现死锁卡死了,要么就是监听端口的那部分代码出问题了。以前我只用过strace -p 来判断是否死锁了,更早之前还试过用gdb调试python服务,但是go的服务,该用什么工具,还不太了解,理论上用strace和gdb也能排查到一些问题的,但是这两个工具都无法识别goroutine,调试起来很难

iris 真的是最快的Golang 路由框架吗

对各种Go http路由框架的比较, Iris明显胜出,它的性能远远超过其它Golang http路由框架。但是,在真实的环境中,Iris真的就是最快的Golang http路由框架吗?Benchmark测试分析在那篇文章中我使用的是Julien Schmidt的 测试代码,他模拟了静态路由、Github API、Goolge+ API、Parse API的各种情况,因为这些API是知名网站的开放的API,看起来测试挺真实可靠的。但是,这个测试存在着一个严重的问题,就是Handler的业务逻辑非常的简单,各个框架的handler类似,比如Iris的Handler的实现:funcirisHandler(_ *iris.Context) {}funcirisHandlerWrite(c *iris.Context) { io.WriteString(c.ResponseWriter, c.Param("name"))}funcirisHandlerTest(c