17_结构体方法与嵌入
组织字段和行为,分清值接收者与指针接收者。
Go 基础专题 17:结构体、方法与嵌入
学习目标:组织字段和行为,分清值接收者与指针接收者。
核心知识
结构体把相关字段放在同一个类型中。字段首字母大写表示其他包可访问,这也影响 JSON 等库能否读取字段。结构体字面量推荐写字段名,避免新增字段后位置含义变化。结构体没有自动构造器;可用普通函数 NewNote(...) 执行校验并返回实例。
package main
import "fmt"
type Note struct {
Title string
Done bool
}
func (n *Note) Finish() { n.Done = true }
func main() {
note := Note{Title: "学习 Go"}
note.Finish()
fmt.Println(note)
}
值接收者会复制接收者,适合小而不可变的值;指针接收者可修改原结构体,且通常用于需要保持一致方法集的类型。嵌入字段写 type Task struct { Note; Priority int },可以提升内嵌类型的方法和字段,但这是组合机制,并非传统类继承;冲突时需明确指定字段路径。
结构体相等比较要求所有字段都可比较;含切片或 map 字段的结构体不能整体 ==。结构体零值是否有用,取决于字段设计和业务约束。
逐步理解
创建两个 Note 实例并只对一个调用 Finish,可验证它们的字段独立。若方法使用值接收者,修改接收者字段只改副本,调用方看不到变化。嵌入字段可省掉显式转发代码,但它把方法也暴露到外层类型;公开 API 设计时应确认这种提升是否符合预期。
动手练习
练习:给 Note 加 Rename(title string) error,空标题时返回错误。答案要点:先校验,成功后修改 n.Title。