Go语言的词法元素分为5类:标识符、关键字、操作符、分隔符、字面量。
注意:
1.和c语言不同的是Go语言中不需要显示地插入分号,在必要时,Go语言会自动为代码插入分号以进行语句分隔。
2.Go语言源代码必须由Unicode编码规范的UTF-8编码格式进行编码。
标识符是由若干个字母、下划线和数字组成的字符序列;该字符序列的第一个字母必须为字母。
Go语言的预定义标识符:
- 所有基本数据类型的名称。
- 接口类型error
- 常量true,false和iota
- 所有内建函数的名称,如append、cap、close、complex、copy、delete、imag、len、make、new、panic、print、println、real和recover。
Go语言中有一个空标识符,它由一个下划线表示。作用是:用于一个不需要引入一个新绑定的声明中。例如,当我们只想执行一下某个代码包中的初始化函数,而不需要使用这个代码包中的任何程序实体的时候,就写如下导入语句:
import _ “runtime/cgo”
"runtime/cgo"是一个标准代码包的标识符。
关键字,是被编程语言保留而不让编程人员作为标识符使用的字符序列。
类别 | 关键字 |
---|---|
程序声明 | import,package |
程序实体声明和定义 | chan, const, func, interface, map, struct, type, var |
程序控制流程 | go, select, break, case, continue, default, defer, else, fallthrough, for, goto, if, range, return, switch |
在Go语言中,程序实体的声明和定义是建立在其数据类型的体系之上的。例如关键字chan、func、interface、map、struct,分别于go语言的复合数据类型Channel(通道)、Function(函数)、interface(接口)、Map(字典)、和struct(结构体)相对应。
程序控制流程的关键字,一共有15个。其中go和select,这两个主要用于Go语言并发编程。
Go语言代码中用到的字面量有以下3类:
1.表示基础数据类型的各种字面量。如,浮点数类型值12E-3
2.构造各种自定义的符合数据类型的类型字面量。
type Person struct{
Name string
Age uint8
Address string
}
Name,Age,Address是类型字面量
3.表示复合数据类型的值的复合字面量。如:
Person{
Name:"HUAZIE"
Age:"21"
Address:"Nanjing,China"
}
注意:GO语言中不允许在一个类中的复合字面量中,出现重复的键。如下都是错误,无法通过编译。
//表示结构体类型值,有重复的键 Name Person {Name: "Huazie",Age: "21", Name: "Unknown"} //表示字典类型值,有重复的键 Age map[string]string{ Name: "Huazie",Age: "21", Age: "21"} //表示切片类型值,有重复的键 0 []string{0: "0", 1: "1", 0: "-1"}
``
从字面量分为基本类型和复合类型。
byte 等同于uint8,占一个字节8位
int 依赖于不同平台下的实现,可以是int32或者int64
int8
int 16
int 32
int 64
rune 等同于int32
uint
uint8
uint16
uint32
uint 64
uintptr
复合类型:
Channel(通道)
Function(函数)
Interface(接口)
Map(字典)
Struct(结构体)
Slice(切片)
Array(数组)
Pointer(指针)
每一个类型都有潜在类型。基础类型的潜在类型是其本身,如String的潜在类型是String类型。
我们也可以自定义一个类型,这个自定义类型的本身就是声明中的基础类型。
如:
type MyString string
Mystring就是string的一个别名类型,潜在类型就是string.Go语言中的rune类型就是uint32的一个类型别名,其潜在类型就是uint32.
注意:
- 类型MyString和类型string是两个不相同的类型。不能将其中一个类型的值赋给另一个类型的变量。
- 别名类型与它的源类型的不同仅仅体现在名称上,它们的内部结构是一致的;下面的类型转换的表达式都是合法的:MyString(“ABC”) 和string(MyString(“ABC”))。这种类型转换并不会创建新的值。
且潜在类型具有传递性。如:
type isString Mystring
则类型isString的潜在类型就是string.
这里声明一个类型,如下:
type Mystring [3]string
[3]string是一个数组类型,但是它并不是Mystring的潜在类型,而潜在类型应该是string .
因为Go语言规定,数组类型的潜在类型决定了该类型变量中存放那一类型的变量。
Go语言的操作符和C语言类似。Go语言一共有21个操作符,包括算术操作符、比较操作符、逻辑操作符、地址操作符、接收操作符。
重点说一下不同的地方:就是接收操作符。
<- | 接收操作符 | <-ch |
---|
<- 接收操作符,只作用于通道类型的值。使用时,需要注意两点:
(1)从一个通道类型的空值(即nil)接收值的表达式将会永远被阻塞。
(2)从一个已被关闭的通道类型值接收值会永远成功并返回一个其元素类型的零值。
特殊标记 = 用于将一个值赋给一个已被声明的变量或常量。
特殊标记 := 则用于在声明一个变量的同时对这个变量进行赋值,且只能在函数体内使用。
又如下:
当同时对两个变量进行赋值或初始化时,第二个变量将会是一个布尔类型的值。这个值代表了接收操作的成功与否。如果是false,表示通道关闭了。