Go语言内置的基本数据类型:
类型 | 说明 | 零值 |
---|---|---|
int |
整型(根据平台32/64位) | 0 |
float64 |
双精度浮点型 | 0.0 |
string |
UTF-8字符串 | “” |
bool |
布尔型(true/false) | false |
rune |
Unicode字符(int32别名) | 0 |
固定长度的连续内存空间,值类型传递:
var arr1 [3]int // 声明:[0 0 0]
arr2 := [...]int{1,2,3} // 编译器推导长度
fmt.Println(arr1 == arr2) // 错误!数组长度不同无法比较
动态数组的抽象,由三部分组成:
type SliceHeader struct {
Data uintptr // 指向底层数组
Len int // 当前长度
Cap int // 总容量
}
当append
操作超过容量时触发扩容:
扩容实验代码:
func main() {
s := make([]int, 0)
for i := 0; i < 2000; i++ {
fmt.Printf("len:%d cap:%d\n", len(s), cap(s))
s = append(s, i)
}
}
输出结果:
len:0 cap:0
len:1 cap:1 ← 初始分配
len:2 cap:2
len:3 cap:4 ← 2→4(2倍)
...
len:1024 cap:1024
len:1025 cap:1280 ← 1024→1280(1.25倍)
基于哈希表实现的键值对集合,核心结构:
type hmap struct {
count int // 当前元素个数
B uint8 // 桶数量的对数(总桶数=2^B)
buckets unsafe.Pointer // 桶数组指针
// 其他字段省略...
}
Map底层操作示例:
m := make(map[string]int, 100)
m["age"] = 25
// 编译器会转换为runtime函数调用:
// runtime.mapassign_faststr(&m, "age", 25)
Go要求显式类型转换:
var a int = 42
var b float64 = float64(a) // 必须显式转换
type MyInt1 int // 类型定义(新类型)
type MyInt2 = int // 类型别名(同一类型)
var x MyInt1 = 10
var y MyInt2 = 20
fmt.Printf("%T\n", x) // main.MyInt1
fmt.Printf("%T\n", y) // int
package main
import (
"fmt"
"strconv"
)
type User struct {
ID int
Name string
Age int
}
var (
users = make([]User, 0) // 使用切片存储
userMap = make(map[int]User) // ID到用户的映射
)
// 添加用户(自动维护切片和Map)
func AddUser(name string, age int) {
id := len(users) + 1
newUser := User{ID: id, Name: name, Age: age}
users = append(users, newUser)
userMap[id] = newUser
fmt.Printf("用户 %s 添加成功!\n", name)
}
// 根据ID查找用户(优先使用Map)
func FindUser(id int) (User, bool) {
user, exists := userMap[id]
return user, exists
}
func main() {
AddUser("Alice", 28)
AddUser("Bob", 35)
if user, ok := FindUser(1); ok {
fmt.Printf("找到用户:%+v\n", user)
}
}
哈希表的桶遍历顺序随机,这是Go的设计特性。若需要有序遍历:
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
使用类型断言(后续章节详解):
var val interface{} = "123"
if num, ok := val.(int); ok {
// 安全转换
}
本章重点:
下节预告:第四章《控制结构》将深入讲解defer执行顺序、panic/recover异常处理!
代码资源
地址:https://download.csdn.net/download/gou12341234/90924447
(包含扩容实验代码、用户管理系统完整实现)
扩展阅读:
- Go Slices: Usage and Internals
- Go maps in action
- Golang类型系统设计哲学