结构体
Go语言的结构体有点像面向对象语言中的“类”,但不完全是,Go语言也没打算真正实现面向对象范式。
定义
使用type定义结构体,可以把结构体看做类型使用。必须指定结构体的字段(属性)名称和类型。
type User struct { id int name, addr string // 多个字段类型相同可以合写 score float32 }
User不过是个标识符,是一个指代罢了 真正的类型定义是struct {} 的部分
初始化

type User struct { id int name, addr string score float32 } // 1 var声明,非常常用 var u1 User // 这种方式声明结构体变量很方便,所有字段都是零值 fmt.Println(u1) fmt.Printf("%+v\n", u1) // 加上字段打印 fmt.Printf("%#v\n", u1) // 加上更多信息打印 // 2 字面量初始化,推荐 u2 := User{} // 字段为零值 fmt.Printf("%#v\n", u2) // 3 字面量初始化,field: value为字段赋值 u3 := User{id: 100} fmt.Printf("%+v\n", u3) u4 := User{ id: 102, score: 95.8, addr: "Nanjing", name: "Tom", } // 名称对应无所谓顺序 u5 := User{103, "John", "Beijing", 98.5} // 无字段名称必须按照顺序给出全部字段值 fmt.Printf("%+v\n", u4) fmt.Printf("%+v\n", u5)
可见性
Go包的顶层代码中,首字母大写的标识符,跨package包可见(导出),否则只能本包内可见
导出的结构体,package内外皆可见,同时,导出的结构体中的成员(属性、方法)要在包外也可见,则也需首字母大写
查询和修改
可以使用字段名称访问和修改
成员方法
利用下面形式为结构体组合方法,这是很方便自由地扩展方式。
type User struct { id int name, addr string score float32 } // u称为receiver // 等价于 func (User) string func (u User) getName() string { return u.name } func main() { u1 := User{103, "John", "Beijing", 98.5} fmt.Println(u1.getName()) }
非引用类型
结构体是非引用类型,和数组一样,使用的是值拷贝。传参或返回值如果使用结构体实例,将产生很多副本。如果避免过多副本,可使用指针。
func test(p *Point) *Point { p.x = 20 p.y = 30 return p } type Point struct { x, y int } func main { p0 := Point{1, 2} fmt.Printf("%+v %[1]T %p\n", p0, &p0) p1 := p0 // 值拷贝类型 fmt.Printf("%+v %[1]T %p\n", p1, &p1) p2 := &p0 // 引用指针来赋值,引用类型 fmt.Printf("%+v %[1]T %p\n", p2, p2) p3 := test(p2) fmt.Printf("%+v %[1]T %p\n", p2, p2) fmt.Printf("%+v %[1]T %p\n", p3, p3) p3.x = 100 // 通过指针修改字段的值 fmt.Printf("%+v %[1]T %p\n", p2, p2) fmt.Printf("%+v %[1]T %p\n", p3, p3) p4 := new(User) // 用new来生成一个新的零值实例 fmt.Printf("%+v %[1]T %p\n", p4, p4) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-07-03 K8S概念