Go 多变量赋值时注意事项

2019-12-08

提到多变量赋值时,先核算一切相关值,然后再从左到右顺次赋值,可是这个规矩不适用于python
咱们来看一例:


package main
import "fmt"
func main {
 data, i := [3]string{"乔帮主","慕容复","鸠摩智"}, 0
 i, data[i] = 2, "隆替大师"
 fmt.println
}

输出成果:

2 [隆替大师 慕容复 鸠摩智] 

有的朋友会以为,成果不该该是这样么??

2 [乔帮主 慕容复 隆替大师]

现实并如此,咱们来看赋值次序这段的了解:

1 data, i := [3]string{"乔帮主","慕容复","鸠摩智"}, 0
2 i, data[i] = 2, "隆替大师" //留意准则:先核算一切相关值,然后再从左到右顺次赋值
3 // 这儿变量i 的次序其实是 - , 
4 fmt.println //所以这儿终究 输出 i=2,[隆替大师 慕容复 鸠摩智]

相同的多变量赋值却不适用于python.

data,i=["乔帮主", "慕容复", "鸠摩智"],0
i, data[i] = 2, "隆替大师" # 留意这儿data[i] 现已是 data[2]了,即data[2]="隆替大师"
print # 输出 2 ['乔帮主', '慕容复', '隆替大师']

别的:咱们要留意从头赋值与界说新同名变量的差异:再看一例:

package main
func main {
 name := "乔帮主"
 println
 name, age := "鸠摩智", 30 // 从头赋值: 与前 name 在同层次的代码块中,且有新的变量被界说。
 println // 一般函数多回来值 err 会被重复运用。
 name, weight := "清风扬", 50 // 界说新同名变量: 不在同层次代码块。
 println
}

输出:

0xc00002bf78
0xc00002bf78 30
0xc00002bf68 50

留意:因个人机器不同,咱们回来的内存引证地址或许和我的不一样,可是 这步是要点。要点在这儿:
同层级相同变量的赋值,内存地址并不会改动。不同层级相同变量的赋值,其实是界说了一个新同名变量,也便是咱们看到的第三行内存地址变了。
接着咱们再看有点意思的一段代码:



package main
func main {
 name := "乔帮主"
 println
 name, age := "鸠摩智", 30 // 从头赋值: 与前 name 在同 层次的代码块中,且有新的变量被界说。
 println // 一般函数多回来值 err 会被重复运用。
 name, weight := 100, 50 // 界说新同名变量: 不在同 层次代码块。
 println
}

输出:

cannot use 100  as type string in assignment

原因很明显,由于上面:name := "乔帮主" 现已隐试滴申明晰name 是字符串,等同于 var name string. 同层级再次赋值100为整形。这是不允许滴,

可是:要点来了,咱们稍改下:

package main
func main {
 name := "乔帮主"
 println
 name, age := "鸠摩智", 30 // 从头赋值: 与前 name 在同 层次的代码块中,且有新的变量被界说。
 println // 一般函数多回来值 err 会被重复运用。
 name, weight := 100, 50 // 界说新同名变量: 不在同层次代码块。
 println
}

差异便是层级发生了改变,由于{}里边的name现已是新的变量了。
好啦,到此介绍完毕了。博友们有关golang变量运用中遇到的各种古怪的 坑 ,请留下名贵滴脚印,欢迎拍砖留言.