【Golang】那些容易忽略的错误

1、 :=为什么没有报错,为什么有报错了?

f, err := Create()
if err != nil {
    ...
}

r, err := Update()
if err != nil {
    ...
}

err := Get()
if err != nil {
    ...
}

我们知道:=可以在函数内对变量进行初始化并赋值,而不用申明变量的类型,具体类型有编译器根据其值进行推测,有点像动态语言的写法,其实这和Golang的强静态语言的特性并不冲突,好吧,这并不是我们的重点;
我们发现Create()和Update()方法在使用:=符号之后编译并没有出错,而Get()方法的这一行编译无法通过。聪明的你一定知道Create()和Update()方法返回的err变量已经不是同一个变量,其内存地址也不一样。那为什么Get()方法就错误了呢?行了,我就不卖关子了,在golang语言中,:=左侧的变量必须至少有一个是没有申明过的,这样就很好理解出错的原因了。
正确的姿势:

var err error
f, err := Create()
if err != nil {
    ...
}

r, err := Update()
if err != nil {
    ...
}

err = Get()
if err != nil {
    ...
}

2、:=在函数内申明的局部变量会屏蔽同名全局变量的可见性

var s string = "hello go"

func main() {
  s := "hello world"
  fmt.Println(s)
}

//output: hello world

有人会问:这个地方应该会编译失败呀,s变量我们已经申明过了,不能使用:= 看来第一条原则需要加一句在同一作用域中才准确了。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,349评论 18赞 399
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,667评论 0赞 6
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,749评论 30赞 472
  • 我从没有想过像今天这样渴望学习。。。 学习嘛,就是学生时代的事儿,现在这么大了,还学习什么?每个年龄阶段有每个年龄...
    麦田的怪圈阅读 367评论 2赞 3
  • 人的一生很简单,健健康康的度过每一天,但对于健康来说,很多人没有太多的去意识这个问题,觉得人嘛总会有生老病死的一天...
    哦嗯好阅读 211评论 0赞 0

友情链接更多精彩内容