Go的变量定义
在 Go 语言中,变量的类型可以是其预定义的那些类型,也可以是程序自定义的函数、结构体或接口。
变量声明的几种方式
1. var name string
这种方式是显式指定字段类型。
func main() {
var name string // [1]
flag.StringVar(&name, "name", "everyone", "The greeting object.") // [2]
flag.Parse()
fmt.Printf("Hello, %v!\n", name)
}
2.var name + flag.String赋值
这里利用了 Go 语言自身的类型推断,而省去了对该变量的类型的声明。类型推断是一种编程语言在编译期自动解释表达式类型的能力。
func main() {
var name = flag.String("name", "everyone", "The greeting object.")
flag.Parse()
fmt.Printf("Hello, %v!\n", *name)
}
3. name := + flag.String短变量声明
这种声明方式实际上就是自动类型判断加上语法糖。
name := flag.String("name", "everyone", "The greeting object.")
Tips: flag.String函数返回的结果值的类型是string而不是string。类型string代表的是字符串的指针类型,而不是字符串类型。
Go的自动类型推断的优点
Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。
比如在下面的例子中,我们可以随意改变getTheFlag函数的内部实现,及其返回结果的类型,而不用修改main函数中的任何代码,使得我们便于进行代码重构。
func main() {
var name = getTheFlag()
flag.Parse()
fmt.Printf("Hello, %v!\n", *name)
}
func getTheFlag() *string {
return flag.String("name", "everyone", "The greeting object.")
}
Go中的变量重声明
我们可以通过使用短变量声明对同一个代码块中的变量进行重声明。
重声明允许我们在使用短变量声明时不用理会被赋值的多个变量中是否包含旧变量。可以想象,如果不这样会多写不少代码。
4个前提
- 由于变量的类型在其初始化时就已经确定了,所以对它再次声明时赋予的类型必须与其原本的类型相同,否则会产生编译错误。
- 变量的重声明只可能发生在某一个代码块中。
- 变量的重声明只有在使用短变量声明时才会发生,否则也无法通过编译。如果要在此处声明全新的变量,那么就应该使用包含关键字var的声明语句,但是这时就不能与同一个代码块中的任何变量有重名了。
- 被“声明并赋值”的变量必须是多个,并且其中至少有一个是新的变量。这时我们才可以说对其中的旧变量进行了重声明。
eg:
var err error
#使用短变量声明对新变量n和旧变量err进行了“声明并赋值”,这时也是对后者的重声明。
n, err := io.WriteString(os.Stdout, "Hello, everyone!\n")