【Go专家编程——语法糖】

语法糖

语法糖表示编程语言中特定类型的语法,这些语法对语言的功能没有影响,但是更方便程序员使用。

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…
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值