美文网首页
Go语言之赋值细节

Go语言之赋值细节

作者: WongBynn | 来源:发表于2021-11-07 20:57 被阅读0次

    简单赋值

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

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

    相关文章

      网友评论

          本文标题:Go语言之赋值细节

          本文链接:https://www.haomeiwen.com/subject/bmcyzltx.html