《Go并发编程实战》读书笔记-语法概览
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
本篇博客我们会快速浏览一下Go的语法,内容涉及基本构成要素(比如标识符,关键字,子面量,操作符等)和基本类型(比如bool,byte,rune,int,string等),高级类型(比如数组,切片,字典,接口,结构体等)和流程控制语句(if,switch,for,defer等)。
一.基本构成要素
Go的语言符号又称为词法元素,共包括5类内容,即标识符(identifier),关键字(keyword),字面量(literal),分隔符(delimiter)和操作符(operator),它们可以组成各种表达式和语句,而后者都无需以分号结尾。
1>.标识符(identifier)
标识符可以表示程序实体,前者即为后者的名称。在一般情况下,同一个代码块中不允许出现同名的程序实体。使用不同代码包中的程序实体需要用到限定标识符,比如:“os.0_RDONLY”。
另外,Go中还存在着一类特殊的标识符,叫作定义标识符,他们是在Go源码中声明的。这类标识符包括以下几种:
第一:所有基本数据类型的名称;
第二:接口类型error;
第三:常量true,false和iota;
所有内建函数的名称,即:append,cap,close,complex,copy,delete,imag,len,make,new,panic,print,println,real和recover。这里强调一下空标识符,它由一个下划线("_")表示,一般用在变量声明或代码包导入语句中。若在代码中存在一个变量“x”,但是却不存在任何对它的使用,则编译器会报错。如果在变量“x”的声明代码后添加这样一行代码:“ _ = x”就可以绕过编译器检查,使它不产生任何编译错误。这是因为这段代码确实用到了变量“x”,只不过它没有在变量“x”上进行任何操作,也没有将它复制给任何变量。空标识符就像一个垃圾桶。在相关初始化工作完成之后,操作对象就会被弃之不用。
2>.关键字(keyword)
关键字是指被编程语言保留的字符序列,编程人员不能把它们用作标识符。因此,关键字也称为保留字。
Go的关键字可以分为3类,包括用于程序声明的关键字,用于程序实体声明和定义的关键字,以及用于程序流程控制的关键字,如下所示:
程序声明: “improt”和“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的关键字共有25个,其中与并发编程有关的关键字又go,chan和select。
这里特别说明一下关键字type的用途,即类型声明。我们可以使用它声明一个自定义的类型,如“type myString string”这里把名为myString的类型声明为string类型的一个别名类型。反过来说,string类型是myString类型的潜在类型。在看另一个例子,基本数据类型rune是int32类型的一个别名类型,int32类型就是rune的潜在类型。虽然类型及其潜在类型是不同的两个类型,但是他们的值可以进行类型转换,例如:string(myString("ABCD"))。这样的类型转换不会产生新值,几乎没声明代价。
自定义的类型一般都会基于Go中的一个或多个预定义类型,就想上面的myString和string那样。如果为自定义类型关联若干方法(函数的变体),那么还可以让它成为某个或某些接口类型的实现类型。另外,还有一个比较特殊的类型,叫空接口。它的类型字面量是“interface{}”,在Go语言中,任何类型都是空接口类型的实现类型。
3>.字面量(literal)
简单来说,字面量就是值的一种标记法。但是,在Go中,字面量的含义要更加广泛一些。我们常常用到的字面量有以下三类:
第一:用于表示基础类型值的各种字面量。这是最常用到的一类字面量,例如表示浮点数类型值的“12E-3”。
第二:用于构造各种自定义的复合数据类型的类型字面量,例如下面定义了一个名称为Name的结构体类型:
type MyName struct { Id int Name string }
第三:用于表示复合数据类型的值的复合字面量,它可以用来构造struct(结构体),array(数组),slice(切片)和map(字典)类型的值。复合字面量一般有字面类型以及被花括号包裹的复合元素的列表组成。字面类型指的就是复合数据类型的名称。例如,下面的复合字面量构造了一个MyName 类型的值,其中MyName表示这个值的类型,紧随其后的就是由键值对表示的复合元素列表。
package main type MyName struct { Id int Name string } func main() { yzj := MyName{ Id:001, Name:"尹正杰", } println(yzj.Id) println(yzj.Name) }
4>.操作符(operator)
5>.表达式
二.基本类型
三.高级类型
四.流程控制语句