Golang 从入门到放弃 -0x08
struct、嵌套结构体、匿名结构体和 tag,开始学会组织业务数据。
写到这里,基本类型、函数、切片这些零件你都见过了。接下来该聊 struct,也就是怎么把一堆零散的数据捆成一个更像样的整体。Go 没有传统意义上的 class,但别急着失望,struct 加方法,很多时候已经够用了。
先定义一个结构体
type User struct {
Name string
Age int
City string
}这个定义很好理解,User 里有三个字段,分别是名字、年龄和城市。
创建结构体实例的方法也有几种。
u1 := User{}
u2 := User{Name: "Raymond", Age: 18, City: "Hangzhou"}
u3 := User{"Tom", 20, "Shanghai"}最后那种按顺序硬塞值的写法不是不能用,但字段一多,或者后面结构改了,很容易把自己坑了。实际开发里,还是更推荐带字段名的写法,可读性高很多。
访问和修改字段
fmt.Println(u2.Name)
u2.Age = 19
fmt.Println(u2)就是这么朴素,没有太多幺蛾子。
结构体也可以嵌套
现实世界里,数据往往不是一层平铺就能装下的,Go 当然也支持嵌套。
type Address struct {
Province string
City string
}
type Profile struct {
Nickname string
Address Address
}
p := Profile{
Nickname: "ray",
Address: Address{
Province: "Zhejiang",
City: "Hangzhou",
},
}这时候访问字段就一层一层点过去。
fmt.Println(p.Address.City)结构体指针
结构体经常会和指针一起出现,因为你不一定想每次都复制整个结构体。
user := &User{Name: "Alice", Age: 22}
fmt.Println(user.Name)
user.Age = 23这里有个对新手很友好的地方:虽然 user 是指针,但访问字段时你依然可以直接写 user.Name,Go 会帮你做一次处理,不需要你每次都手写 (*user).Name 来折磨自己。
匿名结构体
如果这个结构只在局部用一次,懒得专门起名字,也可以用匿名结构体。
config := struct {
Host string
Port int
}{
Host: "127.0.0.1",
Port: 8080,
}这种写法适合临时拼装小数据,但别滥用。匿名结构体一多,代码就容易散发出一种“我今天只是随便糊一下”的气质。
标签 tag 先混个脸熟
你可能已经在别人的代码里见过这种东西:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}这个反引号里的内容叫 tag,常用于 JSON、数据库映射、校验之类的场景。现在先记住它长什么样就行,具体在 JSON 那一章我们再细说。
为什么 struct 重要
因为它决定了你怎么组织业务数据。用户、订单、配置、请求参数、数据库记录,这些东西最后大概率都会落到结构体上。如果前面学的是字词句,struct 基本就是开始写段落了。
小结
这一章没什么特别刁钻的东西,核心就这些:
struct用来组织一组相关的数据。- 推荐用带字段名的方式初始化。
- 结构体和指针经常一起出现,但用起来并不吓人。
- tag 是后面做 JSON、ORM、校验时的高频角色。
下一章我们继续往前一步,看看方法和接口。Go 的“面向对象味道”差不多就从这里开始了。