scala看到一半,还是觉得命令式比较适合我,这几天开始看golang。习惯了看语言先看坑,下面记录一下坑。有些可能不算是坑,反正不是我习惯的我记录一下而已。这里有一个不错的学习golang的入门教程--golang指南。
函数的function ends without a return statement
这是个很奇葩的bug,据golang-Issue65这是个编译器的bug,唯一不懂的是,这个bug是09年提出的,干嘛还不修复呢?先演示一下:
func example(x int) int {
if x == 0 {
return 5
} else {
return x
}
}
就是一个这样的函数居然会报错。。。埋坑的办法还是有的。。。
func example(x int) int {
if x == 0 {
return 5
} else {
return x
}
return 0
}
这个真心奇葩啊,在java这样弄会报dead code的。。。
真正的强类型
golang是真正的强类型啊,强到,我早已经习惯的String + int也是不行了。注意这个坑了,这样连接字符串的方法是:
s := fmt.Sprint("aaa", 0)
// 或者
s := fmt.Sprintf("aaa%v", 0)
唯一值得庆幸的是String + String还是存在的。
array的定义
- array暂时我是没有找到有办法可以定义为const的<
- array不可以用变量来定义长度
小心slice
golang有引用类型的,必须小心,该复制的时候千万不要吝啬。内建函数有copy()。slice定义可以使用变量定义长度,需要用make()来申请空间。
l := 2
sli1 := make([]int, l)
fmt.Println("sli1容量=", cap(sli1))
sli1 = append(sli1, 1, 2, 3)
fmt.Println("sli1=", sli1)
fmt.Println("sli1容量=", cap(sli1))
// 创建sli2
sli2 := sli1[2:5]
fmt.Println("sli2=", sli2)
// 由于指向同个空间,sli1修改会影响到sli2
sli1[2] = 9
fmt.Println("sli2=", sli2)
// 追加让sli1扩容,重新申请空间
sli1 = append(sli1, 1, 2, 3, 4, 5, 6, 7, 8)
// 现在修改sli1不会影响到sli2
sli1[2] = 10
fmt.Println("sli2=", sli2)
上面代码运行的结果是:
sli1容量= 2