首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

golang错题集

原文作者:RyuGou

本文即Go语言的那些坑三。

不要对Go并发函数的执行时机做任何假设

请看下列的列子:

请问输出什么?

答案:

为什么呢?是不是有点诧异?

输出的都是“annei”,而“annei”又是“names”的最后一个元素,那么也就是说程序打印出了最后一个元素的值,而name对于匿名函数来讲又是一个外部的值。因此,我们可以做一个推断:虽然每次循环都启用了一个协程,但是这些协程都是引用了外部的变量,当协程创建完毕,再执行打印动作的时候,name的值已经不知道变为啥了,因为主函数协程也在跑,大家并行,但是在此由于names数组长度太小,当协程创建完毕后,主函数循环早已结束,所以,打印出来的都是遍历的names最后的那一个元素“annei”。

如何证实以上的推断呢?

其实很简单,每次循环结束后,停顿一段时间,等待协程打印当前的name便可。

打印结果:

以上我们得出一个结论,不要对“go函数”的执行时机做任何的假设,除非你确实能做出让这种假设成为绝对事实的保证。

假设T类型的方法上接收器既有类型的,又有指针类型的,那么就不可以在不能寻址的T值上调用接收器的方法

请看代码,试问能正常编译通过吗?

答案:

感觉有点诧异,请接着看以下的代码,试问能编译通过?

答案:

是不是有点奇怪?这是为什么呢?其实在第一个代码示例中,main主函数中的“li”是一个变量,li的虽然是类型Lili,但是li是可以寻址的,&li的类型是,因此可以调用*Lili的方法。

一个包含nil指针的接口不是nil接口

请看下列代码,试问返回什么

答案是输出:surprise。

ok,让我们吧开关关掉,及的值变为。那么输出什么呢?是不是什么都不输出?

答案是:依然输出surprise。

这是为什么呢?

这就牵扯到一个概念了,是关于接口值的。概念上讲一个接口的值分为两部分:一部分是类型,一部分是类型对应的值,他们分别叫:动态类型和动态值。类型系统是针对编译型语言的,类型是编译期的概念,因此类型不是一个值。

在上述代码中,给f函数的out参数赋了一个的空指针,所以out的动态值是nil。然而它的动态类型是bytes.Buffer,意思是:“A non-nil interface containing a nil pointer”,所以“out!=nil”的结果依然是true。

但是,对于直接的``bytes.Buffer``类型的判空不会出现此问题。

还是输出: right

只有 接口指针 传入函数的接口参数时,才会出现以上的坑。

修改起来也很方便,把改为就好了。

将map转化为json字符串的时候,json字符串中的顺序和map赋值顺序无关

请看下列代码,请问输出什么?若为json字符串,则json字符串中key的顺序是什么?

答案:输出

利用Golang自带的json转换包转换,会将map中key的顺序改为字母顺序,而不是map的赋值顺序。map这个结构哪怕利用遍历的时候,其中的key也是无序的,可以理解为map就是个无序的结构,和php中的array要区分开来

Json反序列化数字到interface{}类型的值中,默认解析为float64类型

请看以下程序,程序想要输出json数据中整型加上的值,请问程序会报错吗?

答案是会报错,输出结果为:

```

panic: interface conversion: interface {} is float64, not int

bool, for JSON booleans

float64, for JSON numbers

string, for JSON strings

[]interface{}, for JSON arrays

map[string]interface{}, for JSON objects

nil for JSON null

即使在有多个变量、且有的变量存在有的变量不存在、且这些变量共同赋值的情况下,也不可以使用来给全局变量赋值

往往是用来声明局部变量的,在多个变量赋值且有的值存在的情况下,也可以用来赋值使用,例如:

但是,假如全局变量也使用类似的方式赋值,就会出现问题,请看下列代码,试问能编译通过吗?

答案是:通不过。输出:

但是如果改成如下代码,就可以通过:

输出:

这是什么原因呢?

答案其实很简单,在方法中,如果使用这种方式的话,相当于在函数中又定义了一个和全局变量名字相同的局部变量,而这个局部变量又没有使用,所以会编译不通过。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

Golang语言社区

游戏服务器架构丨分布式技术丨大数据丨游戏算法学习

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180725B1XNPW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券