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

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

来源: 责编: 时间:2024-05-27 17:20:09 223观看
导读学习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不久,在定义全局变量的时候遇见了坑。写个小例子,增强记忆。q6M28资讯网——每日最新资讯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定义了但是没有使用。修改如下:q6M28资讯网——每日最新资讯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的语法特点可能让你稍微不注意就踩坑,嘿嘿。q6M28资讯网——每日最新资讯28at.com

变量作用域

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

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

问题

看下面的代码,定义了一个全局变量t,我想在init()中给他赋值为2,然后在main中使用它。q6M28资讯网——每日最新资讯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)}

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

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

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

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

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

解决

知道原因之后就容易解决了,我不使用:=就可以了。代码如下:q6M28资讯网——每日最新资讯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)}

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

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

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

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

思考

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    7月17日消息,据外媒报道,去年下半年开始的半导体需求下滑,影响到了三星电子、SK海力士、英特尔等诸多厂商,营收明显下滑,部分厂商甚至出现了亏损。作为
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top