Golang关键字和预定义标识符
golang一共有25个关键字,我们只能按照规则使用。
另外golang还有一些预定义标识符,除了按照规则使用外,我们还能当作普通的变量名、方法名等字段使用,但不建议这样做,避免混淆。
关键字
- package:定义包名
- import:引用包,golang目前是不支持循环引用的
A import B,B 不能再引用A;
A import B,B import C,C import A 也是不可以的。 - struct:定义结构体
- interface:定义接口
- type:声明结构体,接口,类型和类型别名。
声明一个类型,是作为一个新的类型使用,虽然本质上和原类型没有区别,但是无法直接当作原类型使用,而别名和原类型使用起来完全相同。
type A = int //int的别名
type B int //新类型b
var a A = 1
var b B = 1
func GetSize(i int) {
println(unsafe.Sizeof(i))
}
//64位机
GetSize(a) //输出8
GetSize(b) //无法通过编译,不能直接把B类型当作int使用
GetSize(int(b)) //输出8,可以强制转换
GetSize(*(*int)(unsafe.Pointer(&b)))//输出8,Pointer当然也是可以的
- func:定义方法
- return:返回当前方法
- const:定义常量(有些语言定义常量不支持表达式,golang是可以的,但是表达式中的值也必须是常量)
- var:定义变量
- go:开启goroutine协程,后面直接跟方法调用
- if,else:条件语句
if可以if 表达式; 判断语句 ,比如下面段代码
//获取hash字典中的值
func GetValue(key string, dic map[string]string) string {
if v, ok := dic[key]; ok {
return v
}
return ""
}
- map:哈希字典
- chan:channel管道,主要用于不同协程直接通信,类似linux管道。
- defer:在方法结束(包括异常)时调用,同一个方法内可以定义多个defer,调用顺序和定义相反。注意,defer后跟的表达式是定义时计算的,不是调用时计算的:
func Defer() {
i := 1
defer println("first", i+1)
i += 1
defer println("second", i)
}
//输出
//second 2
//first 2
- for:循环控制
- select:和case配合使用,监听chan
- switch: 选择控制,和case配合使用
- case:switch和select中的单项
- default:switch选项控制默认值
- fallthrough:switch中继续执行下一个case内的指令
- break:跳出当前循环、switch、select,switch和select默认break,如果不希望break,使用fallthrough;以上这些结构可以用标签命名,break+标签名,可以跳出多层结构。
- continue:跳过循环语句中剩下的指令,直接进入下一次循环。continue也可以使用标签,忽略当前循环结构,直接继续执行标签指定的循环。
- goto:无条件地转移到过程中指定的行,不推荐使用,可控制的小范围内使用。
- range:用来迭代数组、切片、map、chan
预定义标识符
预定义标识符全部列出在源码的builtin包中,只有一个builtin.go文件,并且都有注释说明,大家可以自行阅读。
参考资料:
- 关键字:https://www.runoob.com/go/go-basic-syntax.html
- golang源码:https://github.com/golang/go
ps: 欢迎大家指出文中错误和不足,提出意见,以免误导。