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

相关推荐
jarreyer1 分钟前
数据项目分析标准化流程
开发语言·python·机器学习
你怎么知道我是队长4 分钟前
C语言---printf函数使用详细说明
c语言·开发语言
Coder_Boy_5 分钟前
Spring Boot 事务回滚异常 UnexpectedRollbackException 详解(常见问题集合)
java·spring boot·后端
liulilittle6 分钟前
俄罗斯访问欧洲国际线路优化
开发语言·网络·信息与通信·ip·通信·俄罗斯·莫斯科
风象南6 分钟前
SpringBoot 实现网络限速
后端
陈小桔9 分钟前
logging模块-python
开发语言·python
消失的旧时光-19439 分钟前
函数指针 + 结构体 = C 语言的“对象模型”?——从 C 到 C++ / Java 的本质统一
linux·c语言·开发语言·c++·c
!停10 分钟前
C语言栈和队列的实现
开发语言·数据结构
源代码•宸11 分钟前
Golang语法进阶(定时器)
开发语言·经验分享·后端·算法·golang·timer·ticker
期待のcode13 分钟前
TransactionManager
java·开发语言·spring boot