Golang进阶

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

2017-11-15  本文已影响8人  qishuai

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变量我们已经申明过了,不能使用:= 看来第一条原则需要加一句在同一作用域中才准确了。

上一篇下一篇

猜你喜欢

热点阅读