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