关键字
关键字是一些特殊的用来帮助编译器理解和解析源代码的单词。
截止目前(Go 1.14),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
这些关键字可以分为四组:
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表示同一个类型
零值
每种类型都有一个零值。一个类型的零值可以看作是此类型的默认值。
- 一个布尔类型的零值表示真假中的假。
- 数值类型的零值都是零(但是不同类型的零在内存中占用的空间可能不同)。
- 一个字符串类型的零值是一个空字符串。