Skip to content

struct / 结构体

把一组相关的数据打包成一个整体。

go
type User struct {
    ID   int
    Name string
    Age  int
}
go
var u User
u.ID = 1
u.Name = "Tom"
u.Age = 18
go
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)
}