Go语言结构体

一、什么是结构体(Struct)

结构体是 Go 里用来组织一组不同类型字段的复合数据类型 ,有点像 Java 里的 class,但:

  • 没有继承

  • 没有构造函数

  • 首字母大写 = 对外可见,首字母小写 = 包内可见

示例:

Go 复制代码
type User struct {
    Id    int
    Name  string
    Age   int
}

二、结构体的基本使用

1. 声明 + 初始化

方式一:按字段顺序(不推荐)
Go 复制代码
u := User{1, "Tom", 18}

可读性差,字段一多容易翻车。

方式二:指定字段名(推荐)

Go 复制代码
u := User{
    Id:   1,
    Name: "Tom",
    Age:  18,
}

方式三:new 创建(返回指针)

Go 复制代码
u := new(User)
u.Id = 1
u.Name = "Tom"

2. 访问字段

Go 复制代码
fmt.Println(u.Name)
u.Age = 20

指针也可以直接用 . 访问字段,Go 会自动解引用:

Go 复制代码
pu := &u pu.Age = 21 // 等价于 (*pu).Age = 21

三、结构体与方法(Go 的"面向对象")

1. 给结构体定义方法

Go 复制代码
type User struct {
    Name string
    Age  int
}

func (u User) SayHi() {
    fmt.Println("Hi, I'm", u.Name)
}

调用:

Go 复制代码
u.SayHi()

2. 值接收者 vs 指针接收者(非常重要)

值接收者(拷贝)

Go 复制代码
func (u User) Grow() {
 
    u.Age++

 }

不会修改原对象

指针接收者(推荐)

Go 复制代码
func (u *User) Grow() {
    u.Age++
}

✅ 会修改原对象

经验法则

  1. 只要方法会改结构体内容,一律用指针接收者;

**2.**结构体较大 → 用指针,避免拷贝。

四、结构体标签(tag)------Web / JSON 必备

Go 复制代码
type User struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age,omitempty"`
}

上面Age中的omitempty用途

  • 字段是零值不序列化

  • 非零值 → 正常输出

常见用途:

  • json / xml 序列化

  • gorm ORM 映射

  • validate 参数校验

Go 复制代码
data, _ := json.Marshal(u)

作用:把 Go 数据结构 → JSON 字节数组

五、结构体嵌套(组合代替继承)

Go 没有继承,但有"嵌入结构体"(组合)

Go 复制代码
type Address struct {
    City string
}

type User struct {
    Name string
    Address
}

使用:

Go 复制代码
u := User{
    Name: "Tom",
    Address: Address{
        City: "Beijing",
    },
}

fmt.Println(u.City) // 直接访问

这就是 Go 提倡的:组合优于继承

六、结构体比较 & 零值

1. 零值

结构体不需要显式初始化,每个字段都有零值:

Go 复制代码
var u User

字段零值:

类型 零值
int 0
string ""
bool false
指针 nil
slice / map nil

2. 结构体是否可比较

结构体可以比较,但前提是字段都可比较

Go 复制代码
u1 := User{ID: 1}
u2 := User{ID: 1}

fmt.Println(u1 == u2) // true

如果包含 slice / map / func,就不能直接比较

七、和 Java 的一个快速对比

Java Go
class struct
getter/setter 直接字段访问
继承 组合
构造函数 字面量初始化
private/public 首字母大小写

八、常见坑提醒

  1. 字段小写无法 JSON 序列化
Go 复制代码
type User struct {
    name string // ❌
}
  1. 忘记用指针接收者导致数据不生效

  2. 结构体复制是值拷贝

相关推荐
952361 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S3 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人3 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang4 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全4 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje4 小时前
Java语法进阶
java·开发语言·jvm
uzong4 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
老前端的功夫4 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287924 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本4 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka