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. 结构体复制是值拷贝

相关推荐
wearegogog1232 小时前
基于C# WinForm实现的带条码打印的固定资产管理
开发语言·c#
Lvan的前端笔记2 小时前
python:深入理解 Python 的 `__name__ == “__main__“` 与双下划线(dunder)机制
开发语言·python
爱海贼的无处不在2 小时前
现在还有Java面试者不会开发Starter组件
后端·面试·架构
董世昌413 小时前
什么是扩展运算符?有什么使用场景?
开发语言·前端·javascript
lsx2024063 小时前
C++ 重载运算符和重载函数
开发语言
刺客xs3 小时前
Qt------信号槽,属性,对象树
开发语言·qt·命令模式
2501_921649493 小时前
免费获取股票历史行情与分时K线数据 API
开发语言·后端·python·金融·数据分析
尤物程序猿3 小时前
Java如何不建表完成各种复杂的映射关系(鉴权概念、区域概念、通用概念)
java·开发语言
Insight.4 小时前
背包问题——01背包、完全背包、多重背包、分组背包(Python)
开发语言·python