3.1.2 声明

1.声明语句

声明语句定义了程序的各种实体对象和部分(或全部)属性。以下代码展示了Go语言常用类型的声明。

package mypkg //包的声明
import(
      "fmt"
      "os"
      ...
)
const Pi, pi = 3.1415926, 3.14 //常量的声明
 
type interger int //类型的声明
type Interger interface{}
 
type Example struct{} //结构体的声明
type example struct{}
 
type MyInt = int //使用别名,而非新定义的类型
 
func add(i, j int) (result int, err error)  //函数的声明
func Add(i, j int) (result int, err error)
 
var 变量名字 类型 = 表达式 //变量的声明

每个Go源文件都以“package包名”语句开始,该语句用于描述源文件属于哪个包。在包声明语句后面使用import语句导入依赖包,接着是包这一层级的常量、类型、结构体、函数、变量和方法等的声明。

2.可导出

在Go语言中,如果类型是在函数内部声明的,则仅在函数内有效;如果是在函数外部声明的,则当前包中的所有文件都可以访问。

变量、常量、类型、函数和结构体的可见性与其名称开头字母的大小写有关。如果名称以大写字母开头,则外部程序包可以访问该名称,也称为“可导出”。例如fmt包的Printf函数就是可导出的,即可以被外部包访问。包本身的名字则通常使用小写字母表示。

在前面的示例中,未导出的常量pi、类型interger、结构体example、函数add虽然能够被同一个包内的函数或方法访问,但不能被跨包访问。在Go语言里,导出类似于一种封装机制。

注意:建议源文件的命名与包名相同。

3.作用域

作用域是指在代码中可以有效使用这个名字的范围。在Go语言中,代码段可以按照块来划分。通常,块由大括号“{}”括起来。源码文件和包级别也有块。在Go语言中,不同类型的块可以相互嵌套。

函数内的块:由大括号括起来的代码段,包含在函数体中。

控制结构块:指if、for和switch等语句中的块,同样由大括号括起来。

文件级别的块:整个源码文件本身就是一个块,其包含该文件中定义的所有变量和函数等。

包级别的块:整个包构成一个块,包里面包含多个源文件,包级别的块包括包内所有文件中定义的变量、常量、类型和函数等。

不同类型的块相互嵌套,共同构成了代码结构和作用域。根据Go语言的规范可知,标识符的作用域是基于块的。作用域的范围见表3-2。

表3-2 作用域的范围

图片表格

4.局部变量和全局变量

变量又分为局部变量和全局变量,具体说明如下。

局部变量:在函数内或代码块内声明的变量称为局部变量。参数和返回值变量也是局部变量。

全局变量:其作用域是全局的。在函数体外声明,可以在整个包中使用。若满足可导出性,则可以被外部包使用。