Go 数据类型基础
Go 的数据类型分为两类:基本类型(表示值)和 复合类型(组织值)。
基本类型
整数
| 类型 | 说明 |
|---|---|
int | 有符号,长度随平台而定 |
int8/16/32/64 | 固定长度的有符号整数 |
uint | 无符号,长度随平台 |
uint8/16/32/64 | 固定长度的无符号整数 |
byte | uint8 的别名,用于字节数据 |
rune | int32 的别名,用于 Unicode 字符 |
var age int = 18
var b byte = 'A' // 65
var r rune = '世' // 19990浮点数
var price float64 = 19.99
var rate float32 = 0.85优先用
float64。涉及金额用 decimal 库,浮点数精度不够。
布尔值
var isLogin bool = true
var isDeleted bool = falseGo 不支持 if 1 { }——条件必须是布尔表达式。
字符串
Go 字符串是不可变的。频繁拼接用 strings.Builder:
var builder strings.Builder
builder.WriteString("hello")
builder.WriteString(" ")
builder.WriteString("go")
fmt.Println(builder.String()) // "hello go"string、byte 和 rune 的关系
len("Go语言") 返回字节长度(6),不是字符数。用 range 遍历字符:
text := "Go语言"
for _, ch := range text {
fmt.Printf("%c\n", ch) // G, o, 语, 言
}零值
Go 变量声明后自带默认值,没有”未初始化”状态:
| 类型 | 零值 |
|---|---|
| 整数 | 0 |
| 布尔 | false |
| 字符串 | "" |
| 指针、切片、map、通道、接口、函数 | nil |
| 结构体 | 每个字段各自为零值 |
复合类型
指针
age := 18
p := &age
*p = 20
fmt.Println(age) // 20Go 有指针,但没有指针运算。
数组(固定长度)
var nums [3]int = [3]int{1, 2, 3}长度是类型的一部分,[3]int 和 [4]int 是不同类型。日常优先用切片。
切片(动态长度)
nums := []int{1, 2, 3}
nums = append(nums, 4)
fmt.Println(len(nums)) // 4
fmt.Println(cap(nums)) // 容量Map(键值对)
user := map[string]int{"xiaoxi": 18}
age, ok := user["xiaoxi"]
if ok { fmt.Println(age) }
delete(user, "xiaoxi")初始化用 make() 避免向 nil map 写入。
结构体
type User struct {
ID int
Name string
Age int
}
user := User{ID: 1, Name: "xiaoxi", Age: 18}接口(隐式实现)
Go 使用隐式实现,没有 implements 关键字:
type Speaker interface { Speak() string }
type User struct{ Name string }
func (u User) Speak() string { return "hello, " + u.Name }
func say(s Speaker) { fmt.Println(s.Speak()) }通道(goroutine 通信)
ch := make(chan string)
go func() { ch <- "hello" }()
message := <-ch
fmt.Println(message)类型转换
Go 要求显式转换,即使 int 和 int64 之间也要显式转:
var a int = 10
var b int64 = 20
result := int64(a) + b常见陷阱
| 陷阱 | 说明 |
|---|---|
byte vs rune | byte = ASCII,rune = Unicode 字符 |
| 数组 vs 切片 | 数组定长,切片动态 |
| nil map 写入 | var m map[string]int; m["k"] = 1 会 panic |
| 字符串长度 | len() 返回字节数,不是字符数 |
| 类型转换 | 必须显式转换,即使都是数值类型 |
运行 Go 代码
go run main.go # 运行单个文件
go run . # 运行当前包
go build -o app # 编译为可执行文件交叉编译:
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o output main.go