GO常见的错误99%程序员会遇到(解决方法)

新学习go语言的人可能遇到常见的错误,其中有两个比较常见的错误,需要单独拿出来说下,为什么要单独说呢,因为这两个错误跟其他语言不同,是因为go本身的设计造成的。

在循环(迭代)中使用了变量的引用

在go语言中,循环(迭代)所使用的变量是同一个变量,只是在每次循环的时候被赋于不同的值,这样的做的目的呢,当然是出于高效考虑咯。但是,如果使用不当的话,可能会引起意想不到的行为。

举一个栗子:

func main() {
 var out []*int
 for i := 0; i < 3; i++ {
 out = append(out, &i)
 }
 fmt.Println("Values:", *out[0], *out[1], *out[2])
 fmt.Println("Addresses:", out[0], out[1], out[2])
}

上面的代码会输出:

Values: 3 3 3
Addresses: 0x40e020 0x40e020 0x40e020

因为每次循环中,我们只是把变量 i 的地址放进 out 数组里,因为变量 i 是同一个变量,只有在循环结束的时候,被赋值为3。

解决方法:申明一个新的变量

for i := 0; i < 3; i++ {
 i := i // Copy i into a new variable.
 out = append(out, &i)
 }

结果

Values: 0 1 2
Addresses: 0x40e020 0x40e024 0x40e028

同理对于切片来说,也用有这个问题,因为切片本身就只是一个地址而已

func main() {
 var out [][]int
 for _, i := range [][1]int{{1}, {2}, {3}} {
 out = append(out, i[:])
 }
 fmt.Println("Values:", out)
}

结果:

Values: [[3] [3] [3]]

同样的问题,在循环里使用协程也会遇到

在协程中使用循环变量

按照程序员的思维,都喜欢使用并发,你可能会写出下面的代码: 心里特别开心,原来go 的并发这么简单。

for _, val := range values {
 go func() {
   fmt.Println(val)
 }()
}

但是,你可能会发现输出的结果是一摸一样的! 因为go的协程跑起来也是需要一点时间的,循环结束的时候,可能一个goroute都没有跑完,然后 val 值确被赋值了,所以,你会看到,输出的都是最后一个值

解决方法:

for _, val := range values {
 go func(val interface{}) {
 fmt.Println(val)
 }(val)
}

当然也可以

for i := range valslice {
 val := valslice[i]
 go func() {
 fmt.Println(val)
 }()
}

Reference: github.com/golang/go/w…

总结

以上所述是小编给大家介绍的GO常见的错误99%程序员会遇到,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 解决启动MongoDB错误:error while loading shared libraries: libstdc++.so.6:cannot open shared object file:

    启动MongoDB时,提示: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory [root@SnsWeb ~]# /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath /usr/local/mongodb/logs/mongodb.l

  • mongodb错误tcmalloc: large alloc out of memory, printing stack and exiting解决办法

    最近Mongodb会经常突然挂掉,检查日志发现如下的错误: 复制代码 代码如下: tcmalloc: large alloc 2061584302080 bytes == (nil) @ Tue Nov 26 17:45:04.539 out of memory, printing stack and exiting: 0xdddd81 0x6cfb4e 0x121021d 0xafcc1f 0xaf815f 0xaf8d1d 0xaf8e0f 0xaf52ae 0xaf53c9 0xb1eb1

  • GO语言标准错误处理机制error用法实例

    本文实例讲述了GO语言标准错误处理机制error用法.分享给大家供大家参考.具体分析如下: 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接口,而异常处理机制 panic-recover 一般用在函数内部. error 类型介绍 error 类型实际上是抽象了 Error() 方法的 error 接口,Golang 使用该接口进行标准的错误处理. 复制代码 代码如下: type error interface {  Error() string } 一般情况下,如果函数需要返

  • MongoDb的"not master and slaveok=false"错误及解决方法

    使用mongodb时,出现"not master and slaveok=false"错误,原因是secondary不允许读写. 因为系统中mongodb做了主备,主备切换了,也可能导致这个问题. 把命令mongo --username=root --password=123456  --host=192.168.0.100  admin中的ip换成主ip后查询正常. 问题说明: 首先这是正常的,因为SECONDARY是不允许读写的, 在写多读少的应用中,使用Replica Sets来

  • Mongodb常见错误与解决方法小结(Mongodb中经常出现的错误)

    今天在配置MongoDB时发生了以下几个错误, 已经被我解决了,提供给大家. 2015-05-12T09:30:26.313+0800 I STORAGE [initandlisten] exception in initAndListen: 28574 Cannot start server. Detected data files in /root/Desktop/mongodb/data created by storage engine 'mmapv1'. The configured

  • MongoDB错误32-bit servers don't have journaling enabled by default解决方法

    每次启动MongoDB时总是会收到如下 Unclean shutdown 提示,总结了一下出现该问题的原因及解决方法. 提示如下: 复制代码 代码如下: ************** D:\GREENT~1\PowerCmd>mongod --auth -dbpath C:\mongo\MongoDB\mongo\data Wed May 16 16:06:50 Wed May 16 16:06:50 warning: 32-bit servers don't have journaling e

  • MySQL server has gone away错误提示解决方法

    大概浏览了一下,主要可能是因为以下几种原因: 一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可. 还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了Singleton的做法,虽然多次连接数据库,但其实使用的都是同一个连接,而且程序中某两次操作数据库的间隔时间超过了wait_timeout(SHOW STATUS能看到此设置),那么就可能出现问题.最简单

  • GO常见的错误99%程序员会遇到(解决方法)

    新学习go语言的人可能遇到常见的错误,其中有两个比较常见的错误,需要单独拿出来说下,为什么要单独说呢,因为这两个错误跟其他语言不同,是因为go本身的设计造成的. 在循环(迭代)中使用了变量的引用 在go语言中,循环(迭代)所使用的变量是同一个变量,只是在每次循环的时候被赋于不同的值,这样的做的目的呢,当然是出于高效考虑咯.但是,如果使用不当的话,可能会引起意想不到的行为. 举一个栗子: func main() { var out []*int for i := 0; i < 3; i++ { o

  • php遇到错误Call to undefined function ImageCreate()解决方法

    目录 常规Ubuntu与windows 编译make安装方法 phpize方法 centos安装GD库 在使用php处理一些图像时,有时会出现诸如这样的错误:Call to undefined function imagecreate() 这是由于没有安装或是没有开启php的gd库导致的问题. 常规Ubuntu与windows 解决方案: 一.在linux系统(这里用的是Ubuntu系统)下 首先在终端输入下列命令: sudo apt-get install php5-gd 这样就已经安装完ph

  • Eclipse 项目出现错误(红色叹号)解决方法

    Eclipse 项目出现错误(红色叹号)解决方法 情况:就是项目出现红色感叹号  解决方法: 对准项目右键选择Build Path → configure build path 点击eclipse项目的configure build path后,在弹出来的窗口中,找到Libraries页签,可以看到一些jar包是红色叉号的,这种jar包就是找不到对应文件的jar包,引起这种eclipse项目前面出现红色叹号.eclipse项目前面出现红色感叹号.eclipse项目前面出现红色惊叹号.eclips

  • MySQL 出现错误1418 的原因分析及解决方法

    MySQL 出现错误1418 的原因分析及解决方法 具体错误: 使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418错误. ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its declaration and binary logging is enabled(you *might* want to use the less safe log

  • 关于微信小程序bug记录与解决方法

    微信小程序bug记录 textarea 1.textarea在模拟器上没有padding,可是在真机上会自带padding,而且在外部改不了,并且在安卓和IOS上padding还不一样 第一张图是在开发工具上的,第二张图是在IOS真机上的.从上图可以看出来,在开发工具上显示很正常,而且没有padding,可是在真机上左上角就出现了padding,并且无论你在外部对textarea的padding做任何处理,都无法覆盖. 目前有一种解决方式是根据ios和android的不同平台来给teaxarea

  • 一个applicationContext 加载错误导致的阻塞问题及解决方法

    问题为对接一个sso的验证模块,正确的对接姿势为,接入一个 filter, 然后接入一个 SsoListener . 然而在接入之后,却导致了应用无法正常启动,或者说看起来很奇怪,来看下都遇到什么样的问题,以及是如何处理的? 还是 web.xml, 原本是这样的: (很简洁!) <?xml version="1.0" encoding="UTF-8" ?> <web-app xmlns="http://java.sun.com/xml/n

  • uniapp微信小程序:key失效的解决方法

    uniapp 代码 <template> <view> <image v-for="(item, i) in fileList" :key="item[urlKey]" :src="item[urlKey]"></image> </view> </template> <script> export default { props: { urlKey: {defau

  • 程序员学英语的一个方法

    你可能会问程序员学英语干嘛?是啊.一个小的普普通通的程序员可能真的不用学习英语,甚至可以说学习英语就是浪费他的时间,还不如利用这些时间去敲一些代码,看看计算机的书,或者出去跟朋友喝喝酒,都会比这个有用的多! 话说回来,如果你想做的不仅仅是一个程序员,而是要做一个工程师,一个架构师--那么学习英语就会非常有必要了. 大家都知道计算机室外国佬发明的,编程语言也是外国佬创造的,很多的软件例如各种操作系统,桌面软件基本上都是由外国人发明的.所以如果你想梦想成真,那么学习英语将是你通过成功路上必不可少的一

  • 新手常见6种的python报错及解决方法

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们. 1.NameError变量名错误 报错: >>> print a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined 解决方案:

  • 对于技术人员的出现了运行时间错误,是否要进行调试的解决方法

    第一种:针对网页制作者这个是我们讨论的重点,这样的情况我么需要检查脚本错误,并根据提示的错误行数迅速锁定所在行,并解决,如果是新手应该就没那么容易了,本站提供了一个在线运行脚本并提示错误相对详细的错误提醒在线JS脚本校验器检测js错误如果仍不能解决问题,或这个问题并不影响我们想要得到的结果我们可以用 复制代码 代码如下: window.onerror=function{return true} 放到js代码中即可第二种:针对用户的解决方法通常上网的时候会碰到这种错误,其实这是你访问网站的网页中有

随机推荐