清晰完备的预定义基础类型,使得开发跨平台应用时无须过多考虑符号和长度差异。

类型长度(字节)默认值(零值)说明
bool1false
byte10uint8 的别名
rune40int32 的别名
int, uint4/80默认整数类型,依据目标平台,32/64 位
int8, uint810-128-127, 0-255
int16, uint1620-32768-32767, 0-65535
int32, uint3240-21 亿-21 亿, 0-42 亿
int64, uint6480
float3240.0
float6480.0默认浮点数类型
complex648
complex12816
uintptr4/80足以存储指针的 uint
string""默认值是空串,而非 nil
array数组
struct结构体
functionnil函数
interfacenil接口
mapnil字典,引用类型
slicenil切片,引用类型
channelnil通道,引用类型

支持二进制、八进制、十六进制以及科学记数法。标准库 math 定义了各数字类型的取值范围。

import (
    "fmt" 
    "math" 
) 
  
func main() { 
	a := 0b11101 // 二进制
	b := 071 // 八进制
	c := 0o71 // 八进制
	d := 0xf8a // 十六进制
 
	e := 1e5 // 科学记数法, float64
	f := 1e-1
 
	// 各数字类型的取值范围(math 包)
	fmt.Println(math.MinInt8, math.MaxInt8) 
}

标准库 strconv 可在不同进制(字符串)间转换。

import"strconv" 
  
func main() { 
   a, _ := strconv.ParseInt("1100100", 2, 32) 
   b, _ := strconv.ParseInt("0144", 8, 32) 
   c, _ := strconv.ParseInt("64", 16, 32) 
  
   println(a, b, c) 
  
   println("0b" + strconv.FormatInt(a, 2)) 
   println("0" + strconv.FormatInt(a, 8)) 
   println("0x" + strconv.FormatInt(a, 16)) 
}

使用浮点数时,须注意小数位的有效精度,相关细节可参考 IEEE-754 标准。

别名

在官方的语言规范中,专门提到两个别名。

  • byteuint8 的别名
  • runeint32 的别名

别名类型无须转换,可直接赋值。

但这并不表示,拥有相同底层结构的就属于别名。就算在 64 位平台上 int 和 int64 结构完全一致,也分属不同类型,须显式转换。

  • type a = b:别名
  • type a b:定义新类型(自定义类型)