Go 多變量賦值時注意事項

說到多變量賦值時,先計算全部相關值,而後再從左到右依次賦值,可是這個規則不適用於python
咱們來看一例:python

package main

import "fmt"

func main() {
    data, i := [3]string{"喬幫主","慕容復","鳩摩智"}, 0
    i, data[i] = 2, "枯榮大師"
    fmt.Println(i, data)
}

輸出結果:golang

2 [枯榮大師 慕容復 鳩摩智]  

有的朋友會認爲,結果不該該是這樣麼?(可是python下輸出的結果倒是下面的)?bash

2 [喬幫主 慕容復 枯榮大師]

事實並如此,咱們來看賦值順序這段的理解:函數

1     data, i := [3]string{"喬幫主","慕容復","鳩摩智"}, 0
2     i, data[i] = 2, "枯榮大師" //注意原則:先計算全部相關值,而後再從左到右依次賦值
3     // 這裏變量i 的順序實際上是(i = 0,由於上一行的變量i是0) -> (而後 i = 2), (data[i] 此時取的值是data[0],而不是data[2],也就是data[0] = 枯榮大師)
4     fmt.Println(i, data) //因此這裏最終 輸出 i=2,[枯榮大師 慕容復 鳩摩智]

一樣的多變量賦值卻不適用於python.spa

data,i=["喬幫主", "慕容復", "鳩摩智"],0
i, data[i] = 2, "枯榮大師" # 注意這裏data[i] 已是 data[2]了,即data[2]="枯榮大師"
print(i,data) # 輸出 2 ['喬幫主', '慕容復', '枯榮大師']

另外:咱們要注意從新賦值與定義新同名變量的區別:再看一例:code

package main

func main() {
    name := "喬幫主"
    println(&name)
    name, age := "鳩摩智", 30 // 從新賦值: 與前 name 在同層次的代碼塊中,且有新的變量被定義。
    println(&name, age)    // 一般函數多返回值 err 會被重複使用。
    {
        name, weight := "清風揚", 50 // 定義新同名變量: 不在同層次代碼塊。
        println(&name, weight)
    }
}

輸出:blog

0xc00002bf78
0xc00002bf78 30
0xc00002bf68 50

注意:因我的機器不一樣,你們返回的內存引用地址可能和個人不同,可是 這步是重點。重點在這裏:
同層級相同變量的賦值,內存地址並不會改變。不一樣層級相同變量的賦值,實際上是定義了一個新同名變量,也就是你們看到的第三行內存地址變了。
接着咱們再看有點意思的一段代碼(你們來找茬):內存

package main

func main() {
    name := "喬幫主"
    println(&name)
    name, age := "鳩摩智", 30 // 從新賦值: 與前 name 在同 層次的代碼塊中,且有新的變量被定義。
    println(&name, age)    // 一般函數多返回值 err 會被重複使用。

    name, weight := 100, 50 // 定義新同名變量: 不在同 層次代碼塊。
    println(&name, weight, age)

}

輸出:字符串

cannot use 100 (type int) as type string in assignment

緣由很明顯,由於上面:name := "喬幫主" 已經隱試滴申明瞭name 是字符串,等同於 var name string. 同層級再次賦值100爲整形。這是不容許滴,string

可是:重點來了,咱們稍改下:

package main

func main() {
    name := "喬幫主"
    println(&name)
    name, age := "鳩摩智", 30 // 從新賦值: 與前 name 在同 層次的代碼塊中,且有新的變量被定義。
    println(&name, age)    // 一般函數多返回值 err 會被重複使用。
    {
        name, weight := 100, 50 // 定義新同名變量: 不在同層次代碼塊。
        println(&name, weight, age)
    }
}

區別就是層級發生了變化,由於{}裏面的name已是新的變量了。好啦,到此介紹結束了。博友們有關golang變量使用中遇到的各類奇怪的「坑」,請留下寶貴滴足跡,歡迎拍磚留言.

相關文章
相關標籤/搜索