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

相关推荐
m0_748708058 小时前
C++中的观察者模式实战
开发语言·c++·算法
qq_537562678 小时前
跨语言调用C++接口
开发语言·c++·算法
wjs20248 小时前
DOM CDATA
开发语言
一点程序8 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
Tingjct8 小时前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
猷咪9 小时前
C++基础
开发语言·c++
IT·小灰灰9 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧9 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q9 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳09 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言