语法糖
语法糖表示编程语言中特定类型的语法,这些语法对语言的功能没有影响,但是更方便程序员使用。
1.语法糖:=
1.1 规则一:多变量复制可能会重新声明
我们知道可以使用“:=”可以同时声明多个变量
field1, offset := nextField(str,0)
field2, offset := nextField(str, offset)
在上述代码中offset会被重新声明
- 当“:=”左侧存在新变量时,已声明的变量(如offset)会被重新声明
- 当“:=”左侧不存在新变量时是不被允许的
重新声明不会引入问题要满足一个前提,那就上变量声明要在同一个作用域中出现。出现在不同的作用域中,则很可能创建了新的同名变量,同一函数不同作用域的同名变量往往不是预期做法,很容易引入缺陷。
1.1.1 同作用域
func nextField(num1, num2 int) (int, int) {
return num1, num2
}
func main() {
num1 := 1
num2 := 2
fmt.Println(&num1)
fmt.Println(&num2)
num1, num3 := nextField(num1, num2)
fmt.Println(&num1)
fmt.Println(&num3)
}
1.1.2 不同作用域
func nextField(num1, num2 int) (int, int) {
return num1, num2
}
func main() {
num1 := 1
num2 := 2
fmt.Println(&num1)
fmt.Println(&num2)
go func() {
num1, num3 := nextField(num1, num2)
fmt.Println(&num1)
fmt.Println(&num3)
}()
time.Sleep(3 * time.Second)
}
1.2 规则二: 不用用于函数外部
简短变量声明符只能用于函数中,使用“:=”来声明和初始化全局变量是行不通的。
我们可以理解成“:=”实际上会拆分成两个语句,即声明和赋值。赋值语句不能出现在函数外部。
1.3 变量作用域问题
如果使用“:=”过于随意,那么有可能在多个作用域中声明了同名变量而不自知,从而引发故障
func main() {
num1, num2 := nextField(1, 2)
if num1 == 1 {
num1, num2 := nextField(3, 4)
fmt.Println(num1)
fmt.Println(num2)
}
fmt.Println(num1)
fmt.Println(num2)
}
代码输出如下:
2.语法糖…
可变参函数是指函数的某个参数可有可无,即这个参数的个数可以是0或多个。声明可变参数函数的方式是在参数类型前加上“…”前缀。
可变函数的特征:
- 可变参数必须在函数参数列表的尾部,即最后一个(放在前面会引起编译时歧义)
- 可变参数在函数内部是作为切片来解析的(可以使用range遍历)
- 可变参数可以不填,不填时函数内部当做nil切片处理
- 可变参数必须是相同的类型(如果需要是不同的类型则可以定义为interface{}类型)
- 可变参数部分可以直接传入一个切片,传入的方式为slice…