清晰完备的预定义基础类型,使得开发跨平台应用时无须过多考虑符号和长度差异。
类型 | 长度(字节) | 默认值(零值) | 说明 |
---|---|---|---|
bool | 1 | false | |
byte | 1 | 0 | uint8 的别名 |
rune | 4 | 0 | int32 的别名 |
int, uint | 4/8 | 0 | 默认整数类型,依据目标平台,32/64 位 |
int8, uint8 | 1 | 0 | -128-127, 0-255 |
int16, uint16 | 2 | 0 | -32768-32767, 0-65535 |
int32, uint32 | 4 | 0 | -21 亿-21 亿, 0-42 亿 |
int64, uint64 | 8 | 0 | |
float32 | 4 | 0.0 | |
float64 | 8 | 0.0 | 默认浮点数类型 |
complex64 | 8 | ||
complex128 | 16 | ||
uintptr | 4/8 | 0 | 足以存储指针的 uint |
string | "" | 默认值是空串,而非 nil | |
array | 数组 | ||
struct | 结构体 | ||
function | nil | 函数 | |
interface | nil | 接口 | |
map | nil | 字典,引用类型 | |
slice | nil | 切片,引用类型 | |
channel | nil | 通道,引用类型 |
支持二进制、八进制、十六进制以及科学记数法。标准库 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 标准。
别名
在官方的语言规范中,专门提到两个别名。
byte
是uint8
的别名rune
是int32
的别名
别名类型无须转换,可直接赋值。
但这并不表示,拥有相同底层结构的就属于别名。就算在 64 位平台上 int 和 int64 结构完全一致,也分属不同类型,须显式转换。
type a = b
:别名type a b
:定义新类型(自定义类型)