引入
数据类型分基本类型和复合类型,基本类型是语言最底层的 building block。Go 的基本类型不多,就四类:整型、浮点型、布尔型、字符串。每一类都有固定的大小和行为,搞清楚了才能选对类型、避免溢出和精度问题。
正文
定义
定义
Go 基本类型包括整型(
int8int64、uint8uint64、int、uint)、浮点型(float32、float64)、布尔型(bool)和字符串(string)。它们是 Go 语言内置的、不可再拆分的数据类型。
语法
// 整型
var a int = 100
var b int64 = 9999999999
// 浮点型
var pi float64 = 3.14159
// 布尔型
var ok bool = true
// 字符串
var name string = "Go"例子
整型
var (
a int8 = 127 // -128 ~ 127
b int16 = 32767 // -32768 ~ 32767
c int32 = 2147483647
d int64 = 9223372036854775807
e uint8 = 255 // 0 ~ 255
f uint16 = 65535 // 0 ~ 65535
)| 类型 | 位宽 | 范围 |
|---|---|---|
int8 | 8 | -128 ~ 127 |
int16 | 16 | -32768 ~ 32767 |
int32 | 32 | -2^31 ~ 2^31-1 |
int64 | 64 | -2^63 ~ 2^63-1 |
uint8 | 8 | 0 ~ 255 |
uint16 | 16 | 0 ~ 65535 |
uint32 | 32 | 0 ~ 2^32-1 |
uint64 | 64 | 0 ~ 2^64-1 |
int | 平台相关 | 32 位或 64 位 |
uint | 平台相关 | 32 位或 64 位 |
uintptr | 平台相关 | 足够存放指针 |
日常开发直接用 int 就行,只有在处理二进制数据、网络协议、或者需要精确控制大小时才用其他类型。
浮点型
var f32 float32 = 3.14 // 精度约 7 位
var f64 float64 = 3.141592653589793 // 精度约 15 位
fmt.Println(f32, f64)
// 3.14 3.141592653589793Go 只有 float32 和 float64 两种浮点类型。绝大多数场景用 float64,精度更高,类型推断的默认浮点类型也是 float64。
x := 3.14 // 自动推断为 float64布尔型
var isActive bool = true
var isDeleted bool = false
if isActive {
fmt.Println("激活状态")
}bool 只有 true 和 false 两个值,不能和整数互转(不像 C 语言 0 就是 false)。详见 Go 布尔值。
字符串
var s1 string = "hello"
var s2 string = `raw string, \n 不会被转义`
fmt.Println(s1, s2)字符串是 UTF-8 编码的不可变字节序列,详见 Go 字符串。
类型推断的默认类型
a := 42 // int
b := 3.14 // float64
c := true // bool
d := "hello" // string
e := 'A' // rune (int32)| 字面量形式 | 默认推断类型 |
|---|---|
42 | int |
3.14 | float64 |
true / false | bool |
"hello" | string |
'A' | rune(即 int32) |
常见写法
| 写法 | 说明 |
|---|---|
var x int = 10 | 显式指定整型 |
var x = 10 | 类型推断为 int |
x := 10 | 短变量声明,推断为 int |
var f float64 = 3.14 | 显式指定浮点型 |
f := 3.14 | 类型推断为 float64 |
var b bool = true | 显式布尔值 |
var s string = "hi" | 显式字符串 |
s := + “raw” + ` | 原始字符串(不转义) |
特点
int是最常用的整型,除非有特殊需求否则不要指定int32、int64float64是默认浮点类型,精度更高bool只能是true或false,不能和整数互转string是不可变的,修改字符串实际上是创建新字符串- 不同类型之间必须显式转换,Go 没有隐式类型转换
- 整型溢出在编译期会报错(常量),运行时会 wrap around(变量)
理解
Go 的基本类型设计得很精简,没有 C 语言那种 short、long、long long 的混乱。整型就用 int,浮点就用 float64,布尔就是 bool,文本就是 string。类型推断让代码更简洁,但默认类型要记住。不同类型之间必须显式转换,这是 Go 强类型的核心体现。
引出
基本类型里,字符串是用得最多也是最特别的类型。它虽然看起来像基本类型,但底层是字节序列。接下来看 Go 字符串,深入了解字符串的创建、操作和底层原理。