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 ...
随机推荐
- java学习6-java基础类库
1.与用户互动 2.系统相关 3.常用类 4.日期.时间类
- Cassandra官方介绍及安装
Cassandra官方介绍及安装 这个数据库有很高的伸缩性和可用性,你完全不需要向性能妥协.在硬件或者云设施上做修改 官网:Cassandra官网 一.简介 cassandra这个数据库有很高的伸缩性 ...
- BeetleX服务网关之服务发现与泛域名路由
在新版本的服务网关中提供了服务发现和泛域名路由解决功能,服务发现可以在无须配置的情况下实现服务自动注册到网关中解脱对服务配置的繁琐工作:而泛域名路由则可以针对不同的域名制定不同的负载规则. 使用con ...
- webpack4+koa2+vue 实现服务器端渲染(详解)
_ 阅读目录 一:什么是服务器端渲染?什么是客户端渲染?他们的优缺点? 二:了解 vue-server-renderer 的作用及基本语法. 三:与服务器集成 四:服务器渲染搭建 4.1 为每个请求创 ...
- R的安装
更新时间:2019.09.23 1. 序言 之前曾经用过一段时间的R(一直忍受着原生R那个超级"简洁"的界面),但是后来重装了系统并且学习了Python,就没有再怎么碰过R了.然而 ...
- Html.CSS.JavaScript 学习经验
HTML里面 不要使用 document.getElementsByName() 来获取 元素,会出错. 使用 document.getElementById()更好一些. substring()首字 ...
- JAVA基础知识注意事项
JAVA核心技术卷一 (第十版) 下面是需要注意的: 只有方法名和参数类型叫做方法的签名, 不同的返回类型值不能作为方法的签名.(4.6.1) 这是域与局部变量的主要不同点. 必须明确地初始化方法中的 ...
- 利用span设置文字固定宽度
<input type="radio" name="dispMode" id="rdoManul" value="manul ...
- InfluxDB常见疑问与解答 - 数据写入时如何在表级别指定保留策略
网友Siguoei:我想让一个库中不同的measurment能够指定不同的保存策略.而不是写入时使用数据库的默认保留策略. Answer:这个特性InfluxDB支持的,写入时序数据时,在行协议前加上 ...
- Kali Linux——迈向网络攻防
自从进入大三的课程后,在已学的高数.线代.数论.概率论.信息论.通信等知识的技术上,开始了网络信息安全.网 络攻防的学习.俗话说得好,磨刀不误砍柴工,开始网络攻防之旅也势必要一个好的工具.然 ...