go 用 struct 实现类功能,字段首字母大小写控制导出性,嵌套需显式初始化,零值中引用类型为 nil 易引发 panic,推荐命名字段初始化并检查嵌套指针非空。

Go 语言里没有“类”,但用 struct 就能干净利落地建出带字段、可嵌套、能绑定行为的复杂数据模型——关键不是能不能,而是怎么初始化才不掉坑、字段怎么设才可控、嵌套时怎么避免空指针 panic。
struct 字段首字母大小写决定能否跨包访问
Go 不靠 public/private 关键字控制可见性,只看首字母:大写(如 Name)导出,外部包能读写;小写(如 email)仅限本包内使用。
- 如果定义
type User struct { name string },其他包里u.name直接报错:cannot refer to unexported fieldname - 想让外部只读?把字段设为大写,再配一个不导出的 setter 方法,而不是暴露可写字段
- JSON 序列化也受此规则影响:
json.Marshal只处理导出字段,email不会出现在输出里
嵌套结构体初始化必须显式构造每一层
嵌套不是自动展开的,Addr 是 Address 类型字段,就不能只写 City: "Beijing" —— 编译器不认识这个字段在哪一层。
- 错误写法:
p := Person{Name: "Alice", City: "Beijing"}→ 编译失败:unknown fieldCityin struct literal - 正确写法:
p := Person{Name: "Alice", Addr: Address{City: "Beijing", State: "China"}} - 如果嵌套字段是指针类型(如
Addr *Address),要写成Addr: &Address{City: "Beijing"},否则Addr.City会 panic:invalid memory address or nil pointer dereference - 多级嵌套(比如
Person→Address→Geo)也一样:必须逐层 new 或字面量构造,不能跳步
struct 初始化时缺省字段会填零值,但要注意引用类型是 nil
var p Person 或 p := Person{Name: "Tom"} 都会让未赋值字段取零值,但不同类型的零值行为差异极大。
-
string→ 空字符串"",安全 -
int/bool→0/false,通常安全 -
[]string/map[string]int/*Address→ 全是nil,直接调用len(p.Tags)或p.Meta["key"]会 panic - 如果业务逻辑依赖某个 slice 非空,别靠零值兜底,初始化时就写
Tags: []string{}
用命名字段初始化(field: value)是唯一推荐的字面量写法
按顺序初始化(User{1, "a", 25, "a@b.com"})看着短,但加个字段或调换顺序就全乱,维护成本高。
- 命名初始化支持缺省:
User{ID: 1, Username: "a"},其余字段自动填零值 - 字段顺序无关,改结构体定义不影响已有初始化语句
- 编辑器能提示字段名,拼错(如
Useername)编译期直接报错,不等到运行时才发现 - 嵌套字段也能用点号展开:
Addr: Address{City: "Shanghai"},清晰表达层级
最常被忽略的是嵌套字段的 nil 安全性——哪怕外层 Person 有值,Addr 字段仍可能是 nil,访问前不判空,上线后第一个请求就 crash。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











