Go 多变量赋值时注意事项
说到多变量赋值时,先计算所有相关值,然后再从左到右依次赋值,但是这个规则不适用于python
我们来看一例:
package main
import "fmt"
func main() {
data, i := []string{"乔帮主","慕容复","鸠摩智"},
i, data[i] = , "枯荣大师"
fmt.Println(i, data)
}
输出结果:
2 [枯荣大师 慕容复 鸠摩智]
有的朋友会认为,结果不应该是这样么?(但是python下输出的结果却是下面的)?
[乔帮主 慕容复 枯荣大师]
事实并如此,我们来看赋值顺序这段的理解:
data, i := [3]string{"乔帮主","慕容复","鸠摩智"}, 0
i, data[i] = 2, "枯荣大师" //注意原则:先计算所有相关值,然后再从左到右依次赋值
// 这里变量i 的顺序其实是(i = 0,因为上一行的变量i是0) -> (然后 i = 2), (data[i] 此时取的值是data[0],而不是data[2],也就是data[0] = 枯荣大师)
fmt.Println(i, data) //所以这里最终 输出 i=2,[枯荣大师 慕容复 鸠摩智]
同样的多变量赋值却不适用于python.
data,i=["乔帮主", "慕容复", "鸠摩智"],0
i, data[i] = 2, "枯荣大师" # 注意这里data[i] 已经是 data[2]了,即data[2]="枯荣大师"
print(i,data) # 输出 2 ['乔帮主', '慕容复', '枯荣大师']
另外:我们要注意重新赋值与定义新同名变量的区别:再看一例:
package main
func main() {
name := "乔帮主"
println(&name)
name, age := "鸠摩智", // 重新赋值: 与前 name 在同层次的代码块中,且有新的变量被定义。
println(&name, age) // 通常函数多返回值 err 会被重复使用。
{
name, weight := "清风扬", // 定义新同名变量: 不在同层次代码块。
println(&name, weight)
}
}
输出:
0xc00002bf78
0xc00002bf78
0xc00002bf68
注意:因个人机器不同,大家返回的内存引用地址可能和我的不一样,但是 这步是重点。重点在这里:
同层级相同变量的赋值,内存地址并不会改变。不同层级相同变量的赋值,其实是定义了一个新同名变量,也就是大家看到的第三行内存地址变了。
接着我们再看有点意思的一段代码(大家来找茬):
package main
func main() {
name := "乔帮主"
println(&name)
name, age := "鸠摩智", // 重新赋值: 与前 name 在同 层次的代码块中,且有新的变量被定义。
println(&name, age) // 通常函数多返回值 err 会被重复使用。
name, weight := , // 定义新同名变量: 不在同 层次代码块。
println(&name, weight, age)
}
输出:
cannot use (type int) as type string in assignment
原因很明显,因为上面:name := "乔帮主" 已经隐试滴申明了name 是字符串,等同于 var name string. 同层级再次赋值100为整形。这是不允许滴,
但是:重点来了,我们稍改下:
package main
func main() {
name := "乔帮主"
println(&name)
name, age := "鸠摩智", // 重新赋值: 与前 name 在同 层次的代码块中,且有新的变量被定义。
println(&name, age) // 通常函数多返回值 err 会被重复使用。
{
name, weight := , // 定义新同名变量: 不在同层次代码块。
println(&name, weight, age)
}
}
区别就是层级发生了变化,因为{}里面的name已经是新的变量了。
好啦,到此介绍结束了。博友们有关golang变量使用中遇到的各种奇怪的“坑”,请留下宝贵滴足迹,欢迎拍砖留言.
Go 多变量赋值时注意事项的更多相关文章
- 多变量线性回归时使用梯度下降(Gradient Descent)求最小值的注意事项
梯度下降是回归问题中求cost function最小值的有效方法,对大数据量的训练集而言,其效果要 好于非迭代的normal equation方法. 在将其用于多变量回归时,有两个问题要注意,否则会导 ...
- FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时遇到的坑,给textview赋值时出现的空指针异常
FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时,给textview赋值时出现的空指针异常 public class BaseFr ...
- bash 脚本编程 利用 “=” 赋值时,左右不能留空格
对脚本变量用“=”赋值时, "=" 左右不能留有空格,否则会提示错误. 比如以下例子: #!/bin/bash BEGIN_TIME = `date +%H:%M:%S` ./a. ...
- EF架构~为导航属性赋值时ToList()的替换方案
回到目录 今天在进行EF开发时,遇到一个问题,在进行join查询时,类中的一个集合类型的导航属性,在给它赋值时,将查询出来的结果ToList()后,出错了,linq to entity不支持这种操作, ...
- TStringList TMemo Text与Add赋值的区别 Memo.Text赋值高度注意事项,不得不知的技巧。
Memo.Text赋值高度注意事项,不得不知的技巧. list := TStringList.Create; list.Text:= str: list.Count; list.Clear; l ...
- js的变量使用<bean><list:write>赋值时需加' '
script的变量使用<bean><list:write>赋值时需加' ',如:var code ='<bean:write name="target" ...
- 使用SC命令时注意事项
使用SC命令时注意事项[转] Windows 2003 Server存在一个sc命令,(好像Windows 2000/XP/NT都有这个.)该命令可以手工创建Windows服务(NT Service) ...
- 使用Spring mvc接收整个url地址及参数时注意事项
使用Spring mvc接收整个url地址及参数时注意事项:url= http://baidu?oid=9525c1f2b2cd45019b30a37bead6ebbb&td=2015-08- ...
- <jsp:param>标签给属性赋值时的一个坑
http://blog.sina.cn/dpool/blog/s/blog_58c5066001011gdn.html 因为: <jsp:forward和<jsp:param在被编译成ja ...
随机推荐
- win10系统plsql卡顿、菜单闪烁解决办法
右键快捷方式--属性--兼容性: 设置为以win7模式运行,以管理员模式运行.如图:
- enable_shared_from_this
头文件<memory> enable_shared_from_this是一个模板类. 使用场景:需要把自己类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. str ...
- Libevent::evhttp服务器
#include <cstdio> #include <stdio.h> #include <stdlib.h> #include <string.h> ...
- 百万年薪python之路 -- 并发编程之 多线程 三
1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. 非阻塞: 进程没有遇到IO 当进程遇到IO, ...
- .NETCore下CI/CD之自动化测试
前言 为了呼应<中国.NET开发者峰会2019上海站>,作为演讲嘉宾,我希望和各位同行建立更多的互动,为此,我特地将部分演讲内容,整理成文章先行发布.本文从零开始,一步一步的引导,从安装J ...
- 面试题-javascript-面向对象编程
笔者在某次笔试中遇到这个题:印象很深. function ClassA() { var value=4; this.getValue= function() { return value; } thi ...
- ORACLE定时备份方案
ORACLE定时备份方案 采用ORACLE的EXP工具,实现ORACLE的备份:采用LINUX的服务crond实现定时功能. 1 编辑SH,实现备份功能 #vi oracle_backup.sh,输入 ...
- Linux生产下安装db2V10.1
Db210.1版本安装手册 装新的suse系统后需要做以下几步才能完整安装10.1版本的db2 1.要挂载2个iso文件 首先在跟目录下建目录test1和test2 2.把iso文件挂载到目录下 ...
- 阿里云和微软共同开源的 OAM 对 Kubernetes 开发人员意味着什么?
上周,微软和阿里巴巴共同推出了开放应用模型(OAM),用于定义部署在任何地方的应用模型的一种规范.Rudr是Microsoft基于Kubernetes环境的OAM标准实现. 我用了一个周末来了解OAM ...
- Python 中用面向对象的思想处理网页翻页 (初级)
第一种处理方法: class Pagenation(object): """ 处理分页相关的代码 """ def __init__(self ...