学习go语言的一点体会
业务时间,断断续续学go已有一年了,体会到go语言其实并不是一门真正的高级语言,尽管它有高级语言的一些特性,如gc。但准确的定位,它其实还是一门介于低级和高级语言之间的语言。象java,c#,你不需要对底层的东西太过了解,例如数组,ArrayList,字典,只需要知道功能就可以了,使用基本不会出问题,go就不行了,你必须对底层的东西要了解,不用说都搞得很明白,但至少要了解,了解哪些坑,坑太多了。
例如:
1:var i *int 光这一句,你就要知道它是nil指针,指向内存地址是0的,i==nil ,用它调用方法,赋值,都是错的,因为go中0-255的内存地址是系统留用的,不允许任何操作。你要知道空指针!=nil,只有指针的动态类型和动态值都为空,才等于nil,空指针只是动态值为空,动态类型不为空,那它就!=nil,这在实际使用中有可能会出错。
2: for k,v:=range t ,你要知道t只是个复制的副本,v只是每次复制值,地址不会变,所以不要用&v,否则永远取到最后一次循环v的地址。
3: 例如 切片,你从数组中用s[i:j]来截取生成切片,其实切片底层也是数组,和原数组是共享的,所以你改了切片某个元素的值,对应原数组某个元素的值也变了。
4:例如切片,用append加元素,超过容量,就会生成新的内存地址的切片,你如果原切片在main中,append在一个函数中,没有返回新切片,你会发生main中的老切片不会有任何变化。
5:例如一个函数 func test() r int {
defer func(){
......
}()
return 6
}
return r=6不是原子操作
它可以分解成3步
一:r=6
二:执行defer
三:空的return
.......
太多了,所以不要急着研究框架,研究别人代码,有空先把基础打好,否则做出来的东西,一旦有问题,查还不好找原因。我就遇到这事,一个go exe服务程序,总是运行几天崩溃,最后折腾好久其实就是基础没掌握好的事。