golang 常见知识点

题目链接:https://zhuanlan.zhihu.com/p/26972862

  1. defer顺序问题,后定义的先执行,panic在defer后面才会向上传递,输出:打印后,打印中,打印前,触发异常
  2. for range 迭代时会使用临时变量作为值拷贝,m保存临时变量的地址
  3. goroutine 执行会保存for的变量地址,而第一个for 循环i是值拷贝,所以输出全是10;第二个i作为gofunc参数值拷贝传递进去,所以每个gofunc执行都是当时i的副本,所以输出0~9,至于哪个gofunc先被调度,取决于goroutine的调度机制,应该和每个go版本有关。
  4. 大多数语言的继承逻辑,父类引用不会调子类重载的方法
  5. 有可能出现异常,也有可能不出现。select 语句:其中某个case(channel)出现IO操作,则响应,否则继续阻塞。所以select只有一个case可以被执行到,取决于golang随机选取;select 中只要有一个case能return,则立刻执行。当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。如果没有一个case能return则可以执行”default”块。
  6. defer 函数执行顺序,后定义的先执行,且参数是值拷贝,只与当时副本值相关,所以index:2必定在index:1先执行,但是在定义defe函数时,就已经确定好参数了,加上index:1在index:2前被定义,所以index:10比index:20先执行。
  7. make 初始化会有默认值,所以append前存在数组[0,0,0,0,0]
  8. map 读写会出现竞争,出现panic:concurrent map read and map write,可以参考最近的博文:https://blog.csdn.net/qq_17612199/article/details/78958238
  9. chan缓冲区问题,若定义make([]chan)无缓冲,在chan没有读取的情况写,写操作会被阻塞,意思是在数据未被处理前,写操作不会返回;相反,如果使用了缓冲区,写操作不会被阻塞。
  10. 无法编译通过,首先Student和People没有继承关系,会得到错误 can’t not use xxx as type xxx,其次,重载方法集定义不相同,必须保持定义一致,最后,people没有实现Speak方法,使用peo引用调用Speak方法运行必然报错。
  11. interface{} 不等于nil,底层结构会存储变量,类型,方法集等信息。

猜你喜欢

转载自blog.csdn.net/qq_17612199/article/details/80038290