struct / 结构体
把一组相关的数据打包成一个整体。
go
type User struct {
ID int
Name string
Age int
}go
var u User
u.ID = 1
u.Name = "Tom"
u.Age = 18go
u := User{
ID: 1,
Name: "Tom",
Age: 18,
}struct 没有的
- 继承
- 构造函数(语言层面)
struct 的 访问控制(public / private )只靠大小写,
struct 可以挂方法
挂方法
go
func (u User) SayHello() {
fmt.Println("Hello,", u.Name)
}指针
go
func (u User) Grow() {
// 值接收者会把整个 User struct 复制一份,字段逐个拷贝(按值拷贝)。
// u.Age ++ 不会改变 u
u.Age++
}
func (u *User) Grow() {
u.Age++ // 会改变 u
}这里的 User 和 *User 有区别!!!
虽然两个都写成 u.Grow(),
但值接收者拿到的是 u 的拷贝,
指针接收者拿到的是 u 的地址((&u).Grow()),
Go 只是自动帮我补了 & 或 *。
例 1
go
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X)
}例 2
go
type Vertex struct {
X, Y int
}
var (
v1 = Vertex{1, 2} // 创建一个 Vertex 类型的结构体
v2 = Vertex{X: 1} // Y:0 被隐式地赋予零值
v3 = Vertex{} // X:0 Y:0
p = &Vertex{1, 2} // 创建一个 *Vertex 类型的结构体(指针)
)
func main() {
fmt.Println(v1, p, v2, v3)
}