Go语言之赋值细节

1,197 阅读2分钟

简单赋值

赋值语句用来更新变量所指的值,它最简单的形式由赋值符=,以及符号左边的变量和右边的表达式组成。

 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可以被赋给任何接口变量或引用类型。