Go多変数付与時の注意事項

7469 ワード

多変数付与といえば、すべての相関値を計算してから左から右に順番に付与しますが、このルールはpythonには適用されません.
package main

import "fmt"

func main() {
    data, i := [3]string{"   ","   ","   "}, 0
    i, data[i] = 2, "    "
    fmt.Println(i, data)
}

出力結果:
2 [            ]  

ある友达は、結果はそうではないと思っていますか?(しかしpythonで出力された結果は次の通りです)?
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には適用されない.
data,i=["   ", "   ", "   "],0
i, data[i] = 2, "    " #     data[i]     data[2] , data[2]="    "
print(i,data) #    2 ['   ', '   ', '    ']

また、再割り当てと新しい同名変数の定義の違いに注意します.もう1つの例を見てください.
package main

func main() {
    name := "   "
    println(&name)
    name, age := "   ", 30 //     :    name          ,         。
    println(&name, age)    //          err       。
    {
        name, weight := "   ", 50 //        :         。
        println(&name, weight)
    }
}

出力:
0xc00002bf78
0xc00002bf78 30
0xc00002bf68 50

注意:パーソナルマシンによっては、メモリリファレンスアドレスが私とは異なる場合がありますが、このステップがポイントです.ポイントは、同じレベルの同じ変数の割り当てで、メモリアドレスは変更されません.異なるレベルの同じ変数の付与は、実際には新しい同名変数、すなわち3行目のメモリアドレスが変更されたことを定義しています.次に、ちょっと面白いコードを見てみましょう.
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は整形である.これは許されないことです.
しかし、ポイントが来ました.私たちは少し変更します.
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変数の使用中に出会った様々な奇妙な「穴」について、貴重な足跡を残してください.レンガの伝言を歓迎します.