关于全局变量的坑, golang熟手们经常遇到
原创 fengzi Go语言圈 2024-05-27 08:30 广东 听全文 Go语言圈 Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长 160篇原创内容 公众号学习与交流:Go语言技术微信群
商务合作加微信:LetsFeng
现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.
学习golang不久,在定义全局变量的时候遇见了坑。写个小例子,增强记忆。
错误版本
var p int
func main() {
p, err := test(4)
if err != nil {
log.Fatal(err)
}
}
func test(i int) (int, error) {
return i + 1, nil
}
编译一直不通过,p declared and not used
。后来查了查资料,看见这种其实是在main
里边又重新定义了p,所以一直提示p定义了但是没有使用。修改如下:
正确版本
var p int
func main() {
var err error
p, err = test(4)
if err != nil {
log.Fatal(err)
}
}
func test(i int) (int, error) {
return i + 1, nil
}
补充:golang变量作用域问题-避免使用全局变量
最近遇到了一个变量作用域的问题,一个比较低级的问题,可能作为一个熟手不应该犯这样的低级错误,但是golang的语法特点可能让你稍微不注意就踩坑,嘿嘿。
》》》程序员福利《《《
2024年全网最新JetBrains系列IDE全家桶激活码
点击获取:https://web.52shizhan.cn
变量作用域
全局变量的作用域是整个包,局部变量的作用域是该变量所在的花括号内,这是一个很基础的问题。
我们通常会使用golang的一个语法糖:=来给变量赋值,这种方式可以节省掉我们定义变量的代码,让代码变的更加简洁,但是如果你定义了一个全局变量,又不小心用:=来给它赋值,就会出现一些问题。
问题
看下面的代码,定义了一个全局变量t,我想在init()
中给他赋值为2,然后在main
中使用它。
var t int
func init() {
t, err := strconv.Atoi("2")
if err != nil {
log.Fatalln(err)
}
fmt.Println("init:", t)
}
func main() {
fmt.Println("main:", t)
}
输出:
init: 2
main: 0
执行之后,在init
和main
中打印出了不一样的数字,为什么会不一样呢,可能你仔细一看就知道原因了。很简单,init中的t是用:=
生成的,所以t是局部变量,在init
函数中覆盖了全局变量t。全局变量t并没有被赋值,它还是原来的0值。
我本想在init
中给全局变量t赋值的,却不小心用:=创建了一个局部变量导致全局变量t没有赋值成功,犯了一个低级错误。
解决
知道原因之后就容易解决了,我不使用:=就可以了。代码如下:
var t int
func init() {
var err error
t, err = strconv.Atoi("2")
if err != nil {
log.Fatalln(err)
}
fmt.Println("init:", t)
}
func main() {
fmt.Println("main:", t)
}
输出:
init: 2
main: 2
没有使用:=
之后,init
中的t就是全局变量t,给全局变量t赋值为2,main
中自然输出的就是2,实现了我最初的目的。
思考
这个问题很简单很低级,但是可能一个golang
熟手,在代码远比demo
要复杂的多的实际项目中,不经意间就可能会犯下这样的错误。
这个问题很难保证说下次一定不会出现的,除非你彻底不用全局变量或者彻底不用:=这样的语法糖。
我的建议是这样:
-
尽量少的使用全局变量。
-
尽量少的使用:=语法糖。
-
使用:=的时候要确保左值没有被定义过。
文章链接:https://www.jb51.net/article/211453.htm
更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!
学Go语言哪些事儿290 学Go语言哪些事儿 · 目录 上一篇2024 年 05 月编程语言排行榜,Go会挤掉C#的排名吗? 阅读 434 喜欢此内容的人还喜欢 Golang 中 JSON 操作的 5 个常见陷阱(建议收藏!) Go Official Blog 不看的原因- 内容低质
- 不看此公众号内容
- 内容低质
- 不看此公众号内容
- 内容低质
- 不看此公众号内容
人划线
标签:main,err,golang,init,熟手,Go,全局变量 From: https://www.cnblogs.com/cheyunhua/p/18214932