Go 数据类型基础

发布于:2026-06-02 #go#golang#数据类型 共 663 字 约 3 分钟

Go 的数据类型分为两类:基本类型(表示值)和 复合类型(组织值)。

基本类型

整数

类型说明
int有符号,长度随平台而定
int8/16/32/64固定长度的有符号整数
uint无符号,长度随平台
uint8/16/32/64固定长度的无符号整数
byteuint8 的别名,用于字节数据
runeint32 的别名,用于 Unicode 字符
Go
UTF-8|3 Lines|
var age int = 18
var b byte = 'A'    // 65
var r rune = ''   // 19990

浮点数

Go
UTF-8|2 Lines|
var price float64 = 19.99
var rate float32 = 0.85

优先用 float64。涉及金额用 decimal 库,浮点数精度不够。

布尔值

Go
UTF-8|2 Lines|
var isLogin bool = true
var isDeleted bool = false

Go 不支持 if 1 { }——条件必须是布尔表达式。

字符串

Go 字符串是不可变的。频繁拼接用 strings.Builder

Go
UTF-8|5 Lines|
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 遍历字符:

Go
UTF-8|4 Lines|
text := "Go语言"
for _, ch := range text {
    fmt.Printf("%c\n", ch) // G, o, 语, 言
}

零值

Go 变量声明后自带默认值,没有”未初始化”状态:

类型零值
整数0
布尔false
字符串""
指针、切片、map、通道、接口、函数nil
结构体每个字段各自为零值

复合类型

指针

Go
UTF-8|4 Lines|
age := 18
p := &age
*p = 20
fmt.Println(age) // 20

Go 有指针,但没有指针运算

数组(固定长度)

Go
UTF-8|1 Line|
var nums [3]int = [3]int{1, 2, 3}

长度是类型的一部分,[3]int[4]int 是不同类型。日常优先用切片。

切片(动态长度)

Go
UTF-8|4 Lines|
nums := []int{1, 2, 3}
nums = append(nums, 4)
fmt.Println(len(nums)) // 4
fmt.Println(cap(nums)) // 容量

Map(键值对)

Go
UTF-8|4 Lines|
user := map[string]int{"xiaoxi": 18}
age, ok := user["xiaoxi"]
if ok { fmt.Println(age) }
delete(user, "xiaoxi")

初始化用 make() 避免向 nil map 写入。

结构体

Go
UTF-8|6 Lines|
type User struct {
    ID   int
    Name string
    Age  int
}
user := User{ID: 1, Name: "xiaoxi", Age: 18}

接口(隐式实现)

Go 使用隐式实现,没有 implements 关键字:

Go
UTF-8|4 Lines|
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 通信)

Go
UTF-8|4 Lines|
ch := make(chan string)
go func() { ch <- "hello" }()
message := <-ch
fmt.Println(message)

类型转换

Go 要求显式转换,即使 intint64 之间也要显式转:

Go
UTF-8|3 Lines|
var a int = 10
var b int64 = 20
result := int64(a) + b

常见陷阱

陷阱说明
byte vs runebyte = ASCII,rune = Unicode 字符
数组 vs 切片数组定长,切片动态
nil map 写入var m map[string]int; m["k"] = 1 会 panic
字符串长度len() 返回字节数,不是字符数
类型转换必须显式转换,即使都是数值类型

运行 Go 代码

Bash
UTF-8|3 Lines|
go run main.go     # 运行单个文件
go run .           # 运行当前包
go build -o app    # 编译为可执行文件

交叉编译:

PowerShell
UTF-8|1 Line|
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o output main.go