关键字

关键字是一些特殊的用来帮助编译器理解和解析源代码的单词。
截止目前(Go 1.14),Go中共有25个关键字。

  1. break default func interface select
  2. case defer go map struct
  3. chan else goto package switch
  4. const fallthrough if range type
  5. continue for import return var

这些关键字可以分为四组:

  • constfuncimportpackagetypevar用来声明各种代码元素。
  • chaninterfacemapstruct用做 一些组合类型的字面表示中。
  • breakcasecontinuedefaultelsefallthroughforgotoifrangereturnselectswitch用在流程控制语句中。
  • defergo也可以看作是流程控制关键字, 但它们有一些特殊的作用。

标识符

一个标识符是一个以Unicode字母或者_开头并且完全由Unicode字母和Unicode数字组成的单词。

  • Unicode字母是定义在Unicode标准8.0 中的LuLlLtLmLo分类中的字符。
  • Unicode数字是定义在Unicode标准8.0中的Nd数字字符分类中的字符。

注意:关键字不能被用做标识符。

标识符_是一个特殊字符,它叫做空标识符
所有的类型名、变量名、常量名、跳转标签、包名和包的引入名都必须是标识符。
一个由Unicode大写字母开头的标识符称为导出标识符。 这里导出可以被理解为公开(public)。 其它(即非Unicode大写字母开头的)标识符称为非导出标识符非导出可以被理解为私有(private)。 截至目前(Go 1.14),东方字符都被视为非导出字符。 非导出有时候也被称为未导出

基本类型

类型(type)可以被看作是值(value)的模板,值可以被看作是类型的实例。内置类型也称为预声明类型。

基本内置类型

Go支持如下内置基本类型:

  • 一种内置布尔类型:bool
  • 11种内置整数类型:int8uint8int16uint16int32uint32int64uint64intuintuintptr
  • 两种内置浮点数类型:float32float64
  • 两种内置复数类型:complex64complex128
  • 一种内置字符串类型:string

除了boolstring类型,其它的15种内置基本类型都称为数值类型(整型、浮点数型和复数型)。
Go中有两种内置类型别名(type alias):

  • byteuint8的内置别名。 可以将byteuint8看作是同一个类型。
  • runeint32的内置别名。 可以将runeint32看作是同一个类型。

u开头的整数类型称为无符号整数类型。 无符号整数类型的值都是非负的。 一个数值类型名称中的数字表示每个这个类型的值将在内存中占有多少二进制位(以后简称位)。二进制位常称为比特(bit)。 比如,一个uint8的值将占有8位。 我们称uint8类型的值的尺寸是8位。 因此,最大的uint8值是255, 最大的int8值是127, 最小的int8值是-128

任一个类型的所有值的尺寸都是相同的,所以一个值的尺寸也常称为它的类型的尺寸。

更多的时候,使用字节(byte)做为值尺寸的度量单位。 一个字节相当于8个比特。所以uint32类型的尺寸为4,即每个uint32值占用4个字节。

uintptrint以及uint类型的值的尺寸依赖于具体编译器实现。 通常地,在64位的架构上,intuint类型的值是64位的;在32位的架构上,它们是32位的。 编译器必须保证uintptr类型的值的尺寸能够存下任意一个内存地址。

一个complex64复数值的实部和虚部都是float32类型的值。 一个complex128复数值的实部和虚部都是float64类型的值。

在内存中,所有的浮点数都使用IEEE-754格式存储。

一个布尔值表示一个真假。在内存中,一个布尔值只有两种可能的状态。 这两种状态使用两个预声明(或称为内置)的常量(falsetrue)来表示。

  1. // 一些类型定义声明
  2. type status bool // status和bool是两个不同的类型
  3. type MyString string // MyString和string是两个不同的类型
  4. type Id uint64 // Id和uint64是两个不同的类型
  5. type real float32 // real和float32是两个不同的类型
  6. // 一些类型别名声明
  7. type boolean = bool // boolean和bool表示同一个类型
  8. type Text = string // Text和string表示同一个类型
  9. type U8 = uint8 // U8、uint8和 byte表示同一个类型
  10. type char = rune // char、rune和int32表示同一个类型

零值

每种类型都有一个零值。一个类型的零值可以看作是此类型的默认值。

  • 一个布尔类型的零值表示真假中的假。
  • 数值类型的零值都是零(但是不同类型的零在内存中占用的空间可能不同)。
  • 一个字符串类型的零值是一个空字符串。