简单赋值
赋值语句用来更新变量所指的值,它最简单的形式由赋值符=,以及符号左边的变量和右边的表达式组成。
x = 1 //有名称的变量
*p = true // 间接变量
person.name = "tom" // 结构体成员
count[x] = count[x] * scale //数组或者slice或map的元素
每一个算术操作符和二进制位操作符都对应一个赋值操作符,例如:
count[x] = count[x] * scale
等价于
count[x] *= scale
这点Go语言和Java很类似,此外,对于重复递增或者递减
也可以使用如下操作来进行:
v :=1
v++
v--
多重赋值
简言之,是指允许多个变量可以一起赋值,这个特性比Java高级
x,y = 1,2
a[i],a[j] = a[j],a[i]
# 或者是计算两个数的最大公约数
func gcd(x,y int) int{
for y != 0{
x,y = y,x%y
}
}
# 或者是计算斐波那契数列的第n个数
func fib(n int) int{
x,y = 0,1
for i := 0;i<n;i++{
x,y = y,x+y
}
return x
}
不言而喻,多重赋值最大的好处就是使得代码看起来更加的紧凑、美观
a,b,c=0,1,2
如果调用有多个返回值的函数,那么左边的接收值的个数必须要和右边函数返回值的个数保持一致。
f,err = os.open("test.txt")
类似的情况还有
v,ok = m[key] // map查询
v,ok = x.(T) // 类型断言
v,ok = <- ch // 通道接收
像变量声明一样,可以将不需要的值赋给空标识符:
_,err =io.Copy(dst,src) //丢弃字节的个数
——,ok = x.(T) //检查类型但丢弃结果
可赋值性
赋值操作分为显式和隐式,我们在实际开发中大多都是显式赋值,但是也有许多隐式赋值的情况,比如,一个函数调用隐式地将参数的值赋给对应的参数变量;一个return语句将result赋值给结果变量。
符合类型的字面量表达式,例如slice
medals := []string{"tom","bob","leo"}
隐式地给每一个元素赋值,它可以写成这样:
medals[0] = "tom"
medals[1] = "bob"
medals[2] = "leo"
值得注意的是,尽管map和通道的元素不是普通的变量,但它们也遵循相似的隐式赋值。
不管是隐式赋值还是显式赋值,如果左边的变量和右边的值类型相同,它就是合法的。通俗的说,赋值只有在值对于变量类型是可赋值的时候才合法。
nil可以被赋给任何接口变量或引用类型。
网友评论