语法糖
语法糖通常是用来简化代码编写的,特性就是使用语法糖前后编译的结果是相同的。
go语言的语法糖最具有代表性的莫过于海象表达式:=
1. 简短变量声明符
可以使用关键字var或者直接简短变量声明符:=声明变量,但是使用:=时要注意一些规则
1.1 规则1
多变量赋值可能会重新声明
package main import "fmt" func main(){ a,b:=1,2 fmt.Println(a,b) c,b:=4,5 fmt.Println(c,b) }
可以看到b的值发生了改变
但是如果:=左侧没有新变量的时候是不允许的
package main import "fmt" func main(){ a,b:=1,2 fmt.Println(a,b) a,b:=4,5 fmt.Println(a,b) }
当然,我们重新声明变量的时候还要注意一个问题,那就是变量声明要在同一个作用域中出现;如果在不同作用域中出现,很有可能就创建了新的同名变量。
1.2 规则2
不能用于函数外部
简短变量声明符只能用于函数中,使用:=声明或者初始化全局变量会出错
可以这样理解,我们使用:=时其实是完成了两步操作,第一步声明变量,第二步对声明的变量进行赋值。
而我们在函数外部只能以关键字开头,所以会产生报错。
1.3 规则3
变量作用域的问题
规则1中最后提到不应该在一个函数内部不同作用域中用:=去声明同名变量,这样往往会在不经意间导致混淆出错。
package main import "fmt" func main(){ i,j:=0,0 if true{ j,k:=1,1 fmt.Println(j,k) } fmt.Println(i,j) }
这里的j在不同作用域下就被赋予了不同的值,如果对j混淆操作就可能出错
2. 可变参函数
可变参函数是指函数的某个参数可有可无,个数不确定。声明时需要在参数类型前面加上…前缀
比如最常用的fmt.Println()它的实现就是…interface{},即传入多个接口
最基本的例子
package main import "fmt" func Hello(word string,names ...string){ if names==nil{ fmt.Println("Nobody!") return } for _,people:=range names{ fmt.Println(word,people) } } func main(){ Hello("hi","a","b","c") Hello("hi",[]string{"a","b","c","d"}...) } 复制代码
首先说说可变参函数的特点
- 可变参数必须在可变参函数的尾部,也就是最后一个
- 可变参数在函数内部是作为切片来解析的
- 可变参数可以不填,不填的时候函数内部当做nil切片处理
- 可变参数必须是相同的类型,如果是不同的类型可以定义为interface{}接口类型去实现
再来看看上面的例子,我们如果向可变参函数的可变参数传入切片类型的时候,函数参数部分使用的时候必须使用slice…来表示切片
另外,当我们传入切片的时候并不会产生新的切片,所以函数内部使用的切片和传入的切片是共享存储空间的。 当我们在函数内部修改切片时,也会影响外部调用的切片,所以这个一定要注意。