当前位置:首页 > 科技  > 软件

关于全局变量的坑, Golang熟手们经常遇到

来源: 责编: 时间:2024-05-27 17:20:09 254观看
导读学习golang不久,在定义全局变量的时候遇见了坑。写个小例子,增强记忆。错误版本var p intfunc main() { p, err := test(4) if err != nil { log.Fatal(err) }}func test(i int) (int, error) { return i + 1, nil}编

学习golang不久,在定义全局变量的时候遇见了坑。写个小例子,增强记忆。8fp28资讯网——每日最新资讯28at.com

错误版本

var p intfunc 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定义了但是没有使用。修改如下:8fp28资讯网——每日最新资讯28at.com

正确版本

var p intfunc 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的语法特点可能让你稍微不注意就踩坑,嘿嘿。8fp28资讯网——每日最新资讯28at.com

变量作用域

全局变量的作用域是整个包,局部变量的作用域是该变量所在的花括号内,这是一个很基础的问题。8fp28资讯网——每日最新资讯28at.com

我们通常会使用golang的一个语法糖:=来给变量赋值,这种方式可以节省掉我们定义变量的代码,让代码变的更加简洁,但是如果你定义了一个全局变量,又不小心用:=来给它赋值,就会出现一些问题。8fp28资讯网——每日最新资讯28at.com

问题

看下面的代码,定义了一个全局变量t,我想在init()中给他赋值为2,然后在main中使用它。8fp28资讯网——每日最新资讯28at.com

var t intfunc init() {    t, err := strconv.Atoi("2")    if err != nil {        log.Fatalln(err)    }    fmt.Println("init:", t)}func main() {    fmt.Println("main:", t)}

输出:8fp28资讯网——每日最新资讯28at.com

init: 28fp28资讯网——每日最新资讯28at.com

main: 08fp28资讯网——每日最新资讯28at.com

执行之后,在init和main中打印出了不一样的数字,为什么会不一样呢,可能你仔细一看就知道原因了。很简单,init中的t是用:=生成的,所以t是局部变量,在init函数中覆盖了全局变量t。全局变量t并没有被赋值,它还是原来的0值。8fp28资讯网——每日最新资讯28at.com

我本想在init中给全局变量t赋值的,却不小心用:=创建了一个局部变量导致全局变量t没有赋值成功,犯了一个低级错误。8fp28资讯网——每日最新资讯28at.com

解决

知道原因之后就容易解决了,我不使用:=就可以了。代码如下:8fp28资讯网——每日最新资讯28at.com

var t intfunc 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)}

输出:8fp28资讯网——每日最新资讯28at.com

init: 28fp28资讯网——每日最新资讯28at.com

main: 28fp28资讯网——每日最新资讯28at.com

没有使用:=之后,init中的t就是全局变量t,给全局变量t赋值为2,main中自然输出的就是2,实现了我最初的目的。8fp28资讯网——每日最新资讯28at.com

思考

这个问题很简单很低级,但是可能一个golang熟手,在代码远比demo要复杂的多的实际项目中,不经意间就可能会犯下这样的错误。8fp28资讯网——每日最新资讯28at.com

这个问题很难保证说下次一定不会出现的,除非你彻底不用全局变量或者彻底不用:=这样的语法糖。8fp28资讯网——每日最新资讯28at.com

我的建议是这样:8fp28资讯网——每日最新资讯28at.com

  • 尽量少的使用全局变量。
  • 尽量少的使用:=语法糖。
  • 使用:=的时候要确保左值没有被定义过。

8fp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91017-0.html关于全局变量的坑, Golang熟手们经常遇到

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python中文件的基本操作:Open函数的应用与示例

下一篇: 亿级流量下通用的高并发架构设计

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top