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