2020年4月底入职Tencent CSIG,自此由Java转Go。此时Go最新版是1.14.2,我学习参考的书籍是《Go语言学习笔记》,此书基于Go1.6。
Go是一个非常年轻的编程语言,2012年才发布第1个版本。而Java就比较古老了,1995年发布。
go语句结束后不用分号。入口函数main没有参数,且必须放在main包中。
使用var定义变量:
var x int32
var x = 100
x := 100
一次可以定义多个变量:
a, b := 1, 2
if后面的条件表达式不加括号:
if x > 0 {
}
for循环也不加括号:
for i := 0; i < 10; i++ {
}
for死循环:
for {
}
或者
for true {
}
for...range语法:
x := []int{100, 101, 102}
for i, n:= range x {
println(i, "=", n)
}
在go中,只有for循环,没有while循环,但是可以用for来像while循环那样写,如下:
x := 0
for x < 5 {
println(x)
x++
}
函数可以有多个返回值:
func div(a int, b int) (int, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil }
返回值有多个的话,返回值类型需要用括号括住。
函数可以有不定长入参,但要求参数类型是一样的
func sum(p ...int) int { a := 0 for _, n := range p { a = a + n } return a }
在函数中,可以用defer定义延迟调用,效果等同于java的finally块:
func main() { defer println("abc") str := "amy" var a = str[0:4] println(a) }
上面函数中,虽然str[0:4]会报错,但是还是会打印出abc。像数组和slice的截取一样,字符串截取也用中括号和冒号。str[0:4]意思是取str的子字符串,从索引0开始取4个字符。
panic就相当于java中的throw Exception,panic后面的语句是不可达的
func sum() int { defer println("abc") panic("err") return 0 }
在go中,控制循环,除了常规的break、continue外,多了一个goto,配合label使用,如下
func main() { for i := 1; i < 10; i++ { for j := 1; j < 10; j++ { if j > 1 { goto flag } fmt.Println("i= " + strconv.Itoa(i) + ", j= " + strconv.Itoa(j)) } } flag: fmt.Println("OK") }
goto后面跟一个label,当执行到goto行时,直接跳到后面的label行,执行下一行代码,不管goto行嵌在多少层循环中。
const块
在const块中可以定义多个常量。如果常量没有用等号赋值,那么将沿用上一行的赋值等式,如下
func main() { const ( a = "A" b ) fmt.Println(a) fmt.Println(b) }
常量a赋值为字符串"A",常量b没有用等号赋值,那么将沿用上一行的赋值等式,即b = "A",所以b值也为字符串"A"。
iota使用
iota用在const块中,初始值是0,每新定义一个变量iota值就加1,直到遇见新的const,iota变为0。
func main() { const ( a int = iota b ) const ( c int = iota d int = iota ) fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Println(d) }
常量a由iota赋值,此时iota值为0,故a值为0。给a赋值后,iota变为1,又赋值给b,故b值为1。在新的const块中,iota变为0,同理可知,c值为0,d值为1。
数字与字符串互转:用strconv包
strconv.Itoa(i int) string,整数转字符串。
strconv.Atoi(s string) (int, error),字符串转整数,返回值有2个,第一个是整数,第二个是error。
func main() { const ( a = 0 c = "1" ) fmt.Println(strconv.Itoa(a)) cI, _ := strconv.Atoi(c) fmt.Println(cI) }