块
Go语言中,块是指在一对相匹配的花括号内的一系列(可能为空的)语句。
在源代码中除了显式的块,还有隐式的块:
- 全局块:涵盖了所有Go源码文本
- 包块:涵盖了一个包的所有Go源码文本
- 文件块:涵盖了在一个文件内所有Go源码文本
- 每个for、if、switch语句都视为它自身的隐式块
- switch、select语句的每个条件都是一个隐式块
块可以嵌套并影响作用域。关于作用域,我们留在后面讲解。
标识符
标识符指的是程序元素的名字。我们在前面接触过的包名、变量名、常量名、函数名、类型名等都属于标识符。
在Go语言中,标识符必须以Unicode字符或下划线开头,后面可以跟随任何数量的Unicode字符、下划线和Unicode数字。以下的标识符都是合法的:
a
_x9
ThisIs红色
αβ
以下是不合法的例子
。a // 不能以标点符号开头
9 // 不能以Unicode数字开头
预定义标识符
Go语言预定义了以下标识符,为了防止混淆,应该尽量避免重新声明这些标识符:
类型
bool byte complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr
变量
true false iota
零值
nil
函数:
append cap close complex copy delete imag len
make new panic print println real recover
关键字
Go语言定义了25个关键字,它们不能用做标识符
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
标识符的作用域
- 对于预定义标识符,它们的作用域是全局块。
- 对于不在任何函数或方法内声明的标识符(除了方法),它们的作用域是期所在包的包块;
- 对于在方法接收者、函数参数、函数返回值声明的标识符,它们的作用域是整个函数体;
- 对于导入包的包名,它的作用域是导入声明语句所在的文件块;
- 对于在函数或方法内部声明的标识符,它们的作用域开始于其声明时,结束于包含它的最内层块末尾;
在块A内声明的标识符可以在A的内层块B中被重新声明,被重新声明的标识符作用域遵循上述原则。
需要注意的是,包约定语句中的默认包名不是标识符声明,它的作用是将文件标识为同属一个包,并且在导入声明的时候提供一个默认的包名。
思考
请思考,在下面例子中,程序结束时c的值是什么?
package main
import (
format "fmt" // 给fmt包设置别名为format
)
func main() {
var c, f = 1, 1.0
for c := 0; c <= 300; c += 20 {
f = float64(c)*9/5 + 32
format.Println(c, "\t", f)
}
}