全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-13 6 分钟 ✍️ juanwangdev

Go结构体

Go结构体将多个字段组合为自定义类型,是面向对象的基础。

结构体定义

基本语法

Go
// 定义结构体
type User struct {
    Name string
    Age  int
    Active bool
}

// 使用结构体
var u User
u.Name = "Tom"
u.Age = 25

字段类型

Go
type Person struct {
    Name    string
    Age     int
    Email   string
    Scores  []int      // slice字段
    Tags    map[string]bool  // map字段
    Parent  *Person    // 指针字段(自引用)
}

结构体初始化

指定字段名

Go
u := User{
    Name: "Tom",
    Age:  25,
    Active: true,
}

// 部分字段初始化(其他零值)
u := User{Name: "Tom"}  // Age=0, Active=false

按顺序初始化

Go
// 按字段顺序(必须全部)
u := User{"Tom", 25, true}

// 部分必须用字段名
u := User{"Tom"}  // 编译错误!缺少字段

推荐使用字段名初始化,清晰且可省略字段。

零值初始化

Go
var u User  // 所有字段零值
// Name="", Age=0, Active=false

// new创建指针
u := new(User)  // 返回*User,字段零值

字段访问

直接访问

Go
u := User{Name: "Tom", Age: 25}

// 访问字段
fmt.Println(u.Name)  // Tom
fmt.Println(u.Age)   // 25

// 修改字段
u.Age = 30

指针访问

Go
u := &User{Name: "Tom"}

// 指针直接访问(自动解引用)
fmt.Println(u.Name)  // Tom(自动解引用)
u.Age = 25  // 自动解引用

// 显式解引用
fmt.Println((*u).Name)  // 等价于u.Name

结构体方法

方法定义

Go
type User struct {
    Name string
    Age  int
}

// 值接收者方法
func (u User) GetName() string {
    return u.Name
}

// 指针接收者方法(可修改)
func (u *User) SetAge(age int) {
    u.Age = age
}

方法调用

Go
u := User{Name: "Tom", Age: 25}

// 调用方法
name := u.GetName()
fmt.Println(name)  // Tom

u.SetAge(30)
fmt.Println(u.Age)  // 30

结构体嵌套(组合)

字段嵌套

Go
type Address struct {
    City  string
    Street string
}

type User struct {
    Name    string
    Address Address  // 嵌套结构体
}

u := User{
    Name: "Tom",
    Address: Address{City: "北京", Street: "长安街"},
}

// 访问嵌套字段
fmt.Println(u.Address.City)

匿名嵌套(继承效果)

Go
type User struct {
    Name string
    Address  // 匿名嵌套
}

u := User{
    Name: "Tom",
    Address: Address{City: "北京"},
}

// 直接访问嵌套字段(继承效果)
fmt.Println(u.City)  // 直接访问
fmt.Println(u.Address.City)  // 或通过字段名

结构体可见性

字段导出规则

Go
type User struct {
    Name    string  // 大写,可导出
    age     int     // 小写,不可导出(私有)
    Email   string  // 大写,可导出
}

// 外部包只能访问Name和Email
// 不能访问age

首字母大写字段可导出,小写私有。

结构体初始化对比

方式示例说明
零值var u User字段全部零值
字段名User{Name:"Tom"}推荐,可省略字段
按顺序User{"Tom",25}必须全部字段
newnew(User)返回指针
指针&User{Name:"Tom"}返回指针

要点总结

  • type struct定义结构体
  • 字段名初始化推荐,清晰可省略
  • 部分字段初始化其他自动零值
  • 指针访问自动解引用
  • 值接收者方法不修改原值
  • 指针接收者方法可修改原值
  • 匿名嵌套实现继承效果
  • 大写字段可导出,小写私有

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go映射(map)
下一篇 → Go值接收者与指针接收者
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库