纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

golang全局变量填坑 解决golang 关于全局变量的坑

浪_沏沙   2021-05-06 我要评论
想了解解决golang 关于全局变量的坑的相关内容吗浪_沏沙在本文为您仔细讲解golang全局变量填坑的相关知识和一些Code实例欢迎阅读和指正我们先划重点:golang,全局变量下面大家一起来学习吧

学习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的语法特点可能让你稍微不注意就踩坑嘿嘿

变量作用域

全局变量的作用域是整个包局部变量的作用域是该变量所在的花括号内这是一个很基础的问题

我们通常会使用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赋值为2main中自然输出的就是2实现了我最初的目的

思考

这个问题很简单很低级但是可能一个golang熟手在代码远比demo要复杂的多的实际项目中不经意间就可能会犯下这样的错误

这个问题很难保证说下次一定不会出现的除非你彻底不用全局变量或者彻底不用:=这样的语法糖

我的建议是这样:

尽量少的使用全局变量

尽量少的使用:=语法糖

使用:=的时候要确保左值没有被定义过

以上为个人经验希望能给大家一个参考也希望大家多多支持如有错误或未考虑完全的地方望不吝赐教


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式