
前言本章讲解 Go 中复合数据类型固定长度数组、动态切片 slice、哈希 map、聚合结构体以及 JSON 序列化、文本 / HTML 模板实战是 Go 开发核心基础。4.1 数组Array核心定义数组是固定长度、相同类型元素组成的序列可包含 0 个或多个元素长度属于数组类型的一部分一经定义无法修改Go 中极少直接使用数组日常开发优先使用切片 Slice。数组基础特性访问方式通过索引下标访问下标范围0 ~ len(数组)-1内置函数len()返回数组内元素总个数短板长度固定无法扩容灵活性差因此被切片替代。4.2 切片 Slice4.2.1 切片基础概念定义变长动态序列所有元素类型统一类型标识[]TT 为元素类型无固定长度底层结构切片由三部分组成指针指向底层数组的起始元素不一定是底层数组第一个元素长度 len切片当前有效元素数量容量 cap切片起始位置到底层数组末尾的总长度内置函数len(s)获取切片有效长度cap(s)获取切片底层容量约束条件len(s) ≤ cap(s)4.2.2 切片截取操作s[i:j]取值规则0 ≤ i ≤ j ≤ cap(s)生成新切片引用原底层数组新切片有效元素数量j - i省略简写规则省略 i默认从 0 开始s[:j]省略 j默认取切片长度s[i:]全部省略s[:]完整引用整个底层数组异常与扩容规则截取下标超过cap(s)直接触发 panic 崩溃截取下标超过len(s)但小于cap(s)不会报错新切片长度变大相当于临时扩展切片字符串 /[] byte 切片共性语法统一x[m:n]底层共享原数组时间复杂度 O (1)字符串截取返回新字符串[] byte 截取返回新 [] byte 切片。4.2.3 切片底层引用特性切片存储指针函数传参时函数内可直接修改底层数组元素拷贝切片仅创建底层数组的新别名不会复制底层数据字面量初始化区分数组 切片数组声明时指定长度[5]int{1,2,3}切片不写长度[]int{1,2,3}底层自动创建对应数组切片指针关联该数组切片字面量支持顺序赋值、索引指定赋值、混合赋值三种写法。4.2.4 切片不能使用 比较限制切片不支持判断全部元素是否相等替代方案字节切片可用标准库bytes.Equal()对比禁止比较两大原因切片间接引用底层数组切片可能自包含递归比较会死循环底层数组数据可随时修改同一切片不同时刻元素可能不一致相等判断无稳定意义。4.2.5 nil 切片与空切片区分nil 切片零值切片无底层数组len0、cap0s nil结果为 true非 nil 空切片存在底层数组长度容量为 0例[]int{}、make([]int,3)[3:]s ! nil业务判断规范判断切片是否为空统一使用len(s) 0禁止用s nil转换生成 nil 切片[]int(nil)。4.2.6 make 创建切片语法make([]T, 长度, 可选容量)省略容量时容量 长度底层逻辑make 创建匿名底层数组返回切片仅能通过切片操作访问底层数组。4.2.7 append 内置追加函数作用向切片末尾追加元素扩容逻辑剩余容量充足直接复用原底层数组输入切片与返回切片共享底层数组容量不足自动分配更大内存数组新数组容量略大于所需最小空间优化内存效率拷贝旧数据返回新切片配套工具copy()快速将同类型切片数据拷贝至另一个切片使用规范append 会修改切片长度 / 容量 / 底层数组必须接收返回值更新原切片变量功能拓展append 支持单次追加多个元素也可直接追加完整切片append(s, s2...)。4.3 Map 哈希表4.3.1 Map 基础定义本质无序键值对 (key-value) 集合所有 key 唯一时间复杂度增删查均为常数级 O (1)类型标识map[K]VK 为键类型V 为值类型类型约束key 必须支持比较运算符用于判断 key 是否重复类型规则所有 key 类型统一所有 value 类型统一key 与 value 可不同类型。4.3.2 Map 创建两种方式make 创建空 mapgo运行ages : make(map[string]int)字面量初始化支持预设键值go运行ages : map[string]int{ alice: 31, charlie: 34, }4.3.3 Map 增删改查修改 / 新增键值go运行ages[alice] 32 ages[bob] // 简短赋值语法支持 ages[bob] 1读取 keykey 存在返回对应 valuekey 不存在返回 value 类型零值删除元素内置delete(map, key)go运行delete(ages, alice)4.3.4 nil Map 注意事项map 零值为 nil不绑定任何哈希表底层结构关键规则nil map不能写入数据写入直接 panic使用前必须通过 make 或字面量初始化。4.4 结构体 Struct4.4.1 结构体定义聚合数据类型由 0 个或多个任意类型成员组成每个变量称为结构体成员成员简写相邻同类型成员可合并书写示例定义go运行type Employee struct { ID int Name, Address string // 同类型合并 DoB time.Time Position string Salary int ManagerID int }4.4.2 导出规则结构体成员首字母大写 导出包外可访问小写 未导出仅当前包使用一个结构体可同时包含导出、未导出成员。4.4.3 结构体零值与空结构体结构体零值所有成员自动赋值对应类型零值是推荐默认初始状态空结构体struct{}无任何成员占用内存大小为 0无存储信息但具备实用场景。4.5 JSON 序列化与反序列化4.5.1 JSON 基础JSON通用结构化数据传输文本协议Unicode 编码基础数据类型数字、布尔 true/false、双引号字符串支持 \Uxxxx UTF-16 转义可映射 Go 类型基础类型、数组、切片、结构体、map。4.5.2 Go 与 JSON 编组规则编组Go 结构体 / 切片转为 JSON 字符串开发场景Web 服务 HTTP 接口收发 JSON 数据Tag 标签核心作用Go 结构体成员必须大写导出才能序列化通过json:xxxtag 自定义 JSON 字段名解决 Go 字段名与 JSON 小写字段不匹配问题解码JSON 字符串反向解析为 Go 结构体tag 同样生效可忽略 JSON 多余字段。4.6 文本与 HTML 模板适用场景复杂格式化输出将打印逻辑抽离模板文件便于独立维护修改标准库包text/template通用文本模板html/templateHTML 专用模板自带 XSS 安全转义核心功能将 Go 变量动态填充至预设文本 / HTML 模板中渲染输出。