关键字
关键字是一些特殊的用来帮助编译器理解和解析源代码的单词。
截止目前(Go 1.14),Go中共有25个关键字。
break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var
这些关键字可以分为四组:
const、func、import、package、type和var用来声明各种代码元素。chan、interface、map和struct用做 一些组合类型的字面表示中。break、case、continue、default、else、fallthrough、for、goto、if、range、return、select和switch用在流程控制语句中。defer和go也可以看作是流程控制关键字, 但它们有一些特殊的作用。
标识符
一个标识符是一个以Unicode字母或者_开头并且完全由Unicode字母和Unicode数字组成的单词。
- Unicode字母是定义在Unicode标准8.0 中的Lu、Ll、Lt、Lm和Lo分类中的字符。
- Unicode数字是定义在Unicode标准8.0中的Nd数字字符分类中的字符。
注意:关键字不能被用做标识符。
标识符_是一个特殊字符,它叫做空标识符。
所有的类型名、变量名、常量名、跳转标签、包名和包的引入名都必须是标识符。
一个由Unicode大写字母开头的标识符称为导出标识符。 这里导出可以被理解为公开(public)。 其它(即非Unicode大写字母开头的)标识符称为非导出标识符。 非导出可以被理解为私有(private)。 截至目前(Go 1.14),东方字符都被视为非导出字符。 非导出有时候也被称为未导出。
基本类型
类型(type)可以被看作是值(value)的模板,值可以被看作是类型的实例。内置类型也称为预声明类型。
基本内置类型
Go支持如下内置基本类型:
- 一种内置布尔类型:
bool。 - 11种内置整数类型:
int8、uint8、int16、uint16、int32、uint32、int64、uint64、int、uint和uintptr。 - 两种内置浮点数类型:
float32和float64。 - 两种内置复数类型:
complex64和complex128。 - 一种内置字符串类型:
string。
除了bool和string类型,其它的15种内置基本类型都称为数值类型(整型、浮点数型和复数型)。
Go中有两种内置类型别名(type alias):
byte是uint8的内置别名。 可以将byte和uint8看作是同一个类型。rune是int32的内置别名。 可以将rune和int32看作是同一个类型。
以u开头的整数类型称为无符号整数类型。 无符号整数类型的值都是非负的。 一个数值类型名称中的数字表示每个这个类型的值将在内存中占有多少二进制位(以后简称位)。二进制位常称为比特(bit)。 比如,一个uint8的值将占有8位。 我们称uint8类型的值的尺寸是8位。 因此,最大的uint8值是255, 最大的int8值是127, 最小的int8值是-128。
任一个类型的所有值的尺寸都是相同的,所以一个值的尺寸也常称为它的类型的尺寸。
更多的时候,使用字节(byte)做为值尺寸的度量单位。 一个字节相当于8个比特。所以uint32类型的尺寸为4,即每个uint32值占用4个字节。
uintptr、int以及uint类型的值的尺寸依赖于具体编译器实现。 通常地,在64位的架构上,int和uint类型的值是64位的;在32位的架构上,它们是32位的。 编译器必须保证uintptr类型的值的尺寸能够存下任意一个内存地址。
一个complex64复数值的实部和虚部都是float32类型的值。 一个complex128复数值的实部和虚部都是float64类型的值。
在内存中,所有的浮点数都使用IEEE-754格式存储。
一个布尔值表示一个真假。在内存中,一个布尔值只有两种可能的状态。 这两种状态使用两个预声明(或称为内置)的常量(false和true)来表示。
// 一些类型定义声明type status bool // status和bool是两个不同的类型type MyString string // MyString和string是两个不同的类型type Id uint64 // Id和uint64是两个不同的类型type real float32 // real和float32是两个不同的类型// 一些类型别名声明type boolean = bool // boolean和bool表示同一个类型type Text = string // Text和string表示同一个类型type U8 = uint8 // U8、uint8和 byte表示同一个类型type char = rune // char、rune和int32表示同一个类型
零值
每种类型都有一个零值。一个类型的零值可以看作是此类型的默认值。
- 一个布尔类型的零值表示真假中的假。
- 数值类型的零值都是零(但是不同类型的零在内存中占用的空间可能不同)。
- 一个字符串类型的零值是一个空字符串。
