Go语言中的程序实体包括变量、常量、函数、结构体、接口
1、常见声明变量的方式
1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 ) 7 8 func main() { 9 /* 第一种方式 10 var name string 11 flag.StringVar(&name, "name", "everyone", "The greeting object")*/ 12 13 /* 第二种方式,利用go语言自身的类型推断省去了string 14 var name = *flag.String("name", "everyone", "The greeting object")*/ 15 16 /* 第三种方式,短变量声明 17 name := *flag.String("name", "everyone", "The greeting object")*/ 18 19 flag.Parse() 20 fmt.Printf("Hello, %v!\n", name) 21 }
2、go语言类型推断的好处
可以明显提升程序的灵活性,似的代码重构变得更加容易,同时又不会给代码维护带来额外的负担,更不会损失程序的运行效率
可以先看一段代码
package main import ( "flag" "fmt" ) func getTheFlag() *string { return flag.String("name","everyone", "The greeting object") } func main() { var name = getTheFlag() flag.Parse() fmt.Printf("Hello, %v!\n", *name) }
我们可以用getTheFlag函数包装那个对flag.String函数的调用,并把其结果直接作为getTheFlag函数的结果,结果的类型是*string。这样一来,var name = 右边的表达式可以变为针对getTHRFlag函数的调用表达式,这实际上是对声明并赋值name变量的那行代码的重构(不改变某个程序与外界的任何交互方式和规则,而只改变其内部实现”的代码修改方式)。因此可以随意改变getTheFlag函数内部实现及其返回结果类型,而不用修改main函数中的任何代码,这是程序灵活性的质变。可以不显式地指定变量name的类型,使得它可以被赋予任何类型的值。也就是说,变量name的类型可以在其初始化时由其他程序动态决定。当改变getTheFlag函数的结果类型以后,Go语言的编译器会在你再次构建该程序时自动地更新变量name的类型
Go语言是静态类型的,所以一旦初始化变量时确定了它的类型,这种类型的确定是在编译期完成的,因此不会对程序运行效率产生任何影响
3、变量重声明
通过使用短变量声明,可以对同一代码块((花括号括起来的区域)中的变量进行重声明(对已经声明过得变量再次声明)。它允许我们在使用短变量声明时不用理会被赋值的多个变量中是否包含旧变量
变量重声明的前提条件如下:
1、由于变量的类型在其初始化时就已经确定了,所以对它再次声明时赋予的类型必须与其原本的类型相同,否则会产生编译错误
2、变量重声明只可能发生在某一段代码块中,如果与当前变量重名的是外层代码块中的变量,那么就是另外一种含义了
3、变量的重声明只有在使用短变量声明时才会发生,否则也无法通过编译
4、被声明并赋值的变量必须是多个,并且其中至少有一个是新的变量
var err error n, err := io.WriteString(os.Stdout, "Hello,everyone!\n")