介绍
在 Golang 语言中,有多种声明变量的方式,但是每种方式都有它特殊的功能,本文我们介绍一些关于变量的编程技巧。
编程技巧
类型推断
类型推断就是在声明一个变量时,不指定变量的数据类型,变量的数据类型由右值推断得到。
Golang 语言是一门静态类型的编程语言,我们声明变量或常量时,需要指定变量或常量的数据类型,我们可以显示指定变量的数据类型,也可以使用 Golang 语言的类型推断。
func main () { var name string name = "frank" fmt.Printf("val:%s type:%T\n", name, name) }
阅读上面的代码,我们声明变量 name 的数据类型是 string,看上去也没什么问题,那么,我们再来看一段代码。
func main () { var name string name = getVal() fmt.Printf("val:%s type:%T\n", name, name) } func getVal () string { return "frank" }
阅读上面这段代码,我们将变量 name 的赋值改为使用函数表达式赋值。目前 getVal()
函数的返回结果的数据类型是 string,如果未来我们需要修改 getVal()
函数的返回结果的数据类型为 int,我们 main 函数中的变量 name 也需要进行对应的修改,这样使得我们的应用程序不灵活,增加了我们维护(重构)代码的难度。
如果我们在声明变量 name 时,不使用指定数据类型的方式,而是通过简短声明的方式(也可以使用 var 变量名 = 表达式
的语法)使用 Golang 语言的类型推断功能,上述的问题就解决了。如果你使用过动态类型(弱类型)的编程语言,比如 Python 或 PHP,是不是感觉这种方式,可能会有所感触。
func main () { // var name = getVal() name := getVal() fmt.Printf("val:%s type:%T\n", name, name) } // func getVal () string { // return "frank" // } func gateVal () int { return 1 }
重新声明变量
所谓重新声明变量,就是将已经存在的变量重新定义,使用简短声明变量的方式,将同一代码块中的变量重新声明。
重新声明变量有一些前提条件:
- 重新声明变量,必须使用简短声明方式。
- 重新声明变量,不能修改原变量的数据类型。
- 重新声明变量,左边的变量至少包含一个未声明过的变量。
- 重新声明变量,只作用于同一代码块中的变量。
我们了解了重新声明变量,不知道有没有体会到它的好处,在我看来,重新声明变量的好处就是可以减少代码量。
未使用重新声明变量:
func main () { var name string name = "lucy" var age uint age = 18 name = "frank" fmt.Printf("name:%s age:%d\n", name, age) }
使用重新声明变量:
func main () { var name string name = "lucy" name, age := "frank", 18 fmt.Printf("name:%s age:%d\n", name, age) }
阅读上面这两段代码,我们发现使用简短声明的方式重新声明变量 name,无需关心被赋值的变量中是否已存在,而且可以减少代码量,并且必须使用简短声明的方式,因为如果使用 var 关键字声明已存在的变量会引发编译错误。
同名变量
所谓同名变量,是指在不同代码块,相同变量名的变量,因为在同一代码块,变量名相同会引发编译错误。
package main import ( "fmt" ) var a = 1 func main () { a := "golang" fmt.Printf("val:%s type:%T\n", a, a) }
阅读上面这段代码,我们分别在 main 包代码块和 main 函数代码块声明了变量 a,通过打印结果可以看出打印的是 main 函数中的变量 a。该示例代码说明位于不同代码块的同名变量,因为其作用域也不同,所以不会引发编译错误。
03
总结
本文我们介绍了关于变量的一些编程技巧,包括类型推断,重新声明变量和同名变量。如果用好这些关于变量的编程技巧,可以有效提升代码的可维护性和健壮性。
推荐阅读:
参考资料:
https://tour.go-zh.org/basics/14
https://docs.hacknode.org/gopl-zh/ch2/ch2-03.html
https://docs.hacknode.org/gopl-zh/ch2/ch2-07.html