15分钟学 Go 第 16 天:结构体

第16天:结构体

目标:学习自定义数据类型

在Go语言中,结构体(struct)是一种用于将多个相关数据组合成一个单元的自定义数据类型。结构体可以让我们更清晰地表示实际世界中的对象及其特性。今天,我们将详细讨论结构体的定义、使用、方法和在实际应用中的示例,帮助你全面理解这一概念。

1. 结构体的基本概念

结构体是一种聚合数据类型,用于组合多个相关属性。每个属性都有一个名称和类型。下面是一个简单的结构体定义示例:

go 复制代码
type Person struct {
    Name string
    Age  int
}

在这个示例中,我们定义了一个名称为 Person 的结构体,它包含两个字段:Name(字符串类型)和 Age(整型)。

表格:结构体定义示例
字段名 字段类型 描述
Name string 人的姓名
Age int 人的年龄

2. 创建和使用结构体

我们可以通过使用 new 关键字或直接初始化的方式来创建结构体的实例。这里有两个示例:

示例代码:创建结构体实例
go 复制代码
func main() {
    // 使用组合初始化
    person1 := Person{Name: "Alice", Age: 30}

    // 使用 new 创建
    person2 := new(Person)
    person2.Name = "Bob"
    person2.Age = 25

    fmt.Println(person1)
    fmt.Println(person2)
}
代码运行流程图
plaintext 复制代码
+---------------------+
|   main函数开始     |
+---------------------+
          |
          v
+---------------------+
| 创建person1        |
| 直接初始化        |
+---------------------+
          |
          v
+---------------------+
| 创建person2        |
| 使用new关键字     |
+---------------------+
          |
          v
+---------------------+
| 输出person1        |
| 输出person2        |
+---------------------+
          |
          v
+---------------------+
|   main函数结束     |
+---------------------+

3. 访问结构体字段

我们可以通过点操作符(.)访问结构体的字段。以下是如何访问 Person 结构体字段的示例:

示例代码:访问字段
go 复制代码
func main() {
    person := Person{Name: "Alice", Age: 30}
    fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}

4. 使用结构体的方法

结构体不仅可以包含数据,还可以包含与数据相关的方法。方法可以让我们对结构体进行操作和处理。

示例代码:定义方法
go 复制代码
type Person struct {
    Name string
    Age  int
}

// 定义一个方法
func (p *Person) Greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    person := Person{Name: "Alice", Age: 30}
    person.Greet()
}

5. 结构体的嵌套

Go语言允许结构体嵌套,这意味着你可以在一个结构体中包含另一个结构体作为其字段。例如,我们可以定义一个 Address 结构体并将其嵌套在 Person 结构体中。

示例代码:嵌套结构体
go 复制代码
type Address struct {
    City    string
    State   string
    ZipCode string
}

type Person struct {
    Name    string
    Age     int
    Address // 嵌套结构体
}

func main() {
    person := Person{
        Name: "Alice",
        Age:  30,
        Address: Address{
            City:    "New York",
            State:   "NY",
            ZipCode: "10001",
        },
    }
    fmt.Printf("Name: %s, Age: %d, City: %s\n", person.Name, person.Age, person.Address.City)
}

6. 结构体与JSON

在实际开发中,结构体常用于数据的序列化与反序列化,尤其是与JSON的交互。Go标准库提供了 encoding/json 包来处理JSON数据。

示例代码:JSON序列化与反序列化
go 复制代码
import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    person := Person{Name: "Alice", Age: 30}
    
    // 序列化
    data, err := json.Marshal(person)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(data))

    // 反序列化
    var person2 Person
    err = json.Unmarshal(data, &person2)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("Name: %s, Age: %d\n", person2.Name, person2.Age)
}

7. 结构体在并发中的应用

在Go语言的并发编程中,结构体也扮演着重要角色。我们可以使用结构体来将数据封装在 goroutine 之间传递。

示例代码:结构体与并发
go 复制代码
import (
    "fmt"
    "sync"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var wg sync.WaitGroup
    persons := []Person{
        {Name: "Alice", Age: 30},
        {Name: "Bob", Age: 25},
    }

    for _, person := range persons {
        wg.Add(1)
        go func(p Person) {
            defer wg.Done()
            fmt.Printf("Processing %s, Age: %d\n", p.Name, p.Age)
        }(person)
    }

    wg.Wait()
}

8. 结构体的注意事项

  1. 字段可见性:字段名首字母大写是公有的(exported),小写是私有的(unexported)。
  2. 内存布局:结构体的内存布局由字段的顺序决定,可能影响性能,选择字段顺序时要考虑对齐。
  3. 零值:结构体的零值是所有字段的零值,成立时可以用于判断。

9. 结构体的练习

通过以下练习,加深对结构体的理解。

练习1 :定义一个 Book 结构体,包含标题(Title),作者(Author),价格(Price)字段;然后实现一个方法,打印书籍信息。

练习2 :定义一个 Company 结构体,包含名称(Name),地址(Address),和员工数(EmployeeCount)字段,使用嵌套结构体表示地址。

10. 总结

今天我们学习了Go语言中的结构体,了解了如何定义、使用结构体以及与结构体相关的方法和操作。结构体在Go语言中是非常重要的自定义数据类型,通过它我们能够有效地管理和操作相关的数据。希望你能在实际项目中灵活应用这些知识!


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关推荐
superior tigre5 分钟前
C++学习:六个月从基础到就业——面向对象编程:虚函数与抽象类
开发语言·c++·学习
ademen11 分钟前
关于 IntelliJ IDEA 中频繁出现的 Kotlin 及其核心作用
java·开发语言·kotlin
绝无仅有27 分钟前
使用 Docker 安装 Elastic Stack 并重置本地密码
后端·面试·github
老A技术联盟40 分钟前
聊一聊消息中间件的后起之秀-pulsar及其实践
后端
隐-梵1 小时前
Android studio前沿开发--利用socket服务器连接AI实现前后端交互(全站首发思路)
android·服务器·人工智能·后端·websocket·android studio·交互
uhakadotcom1 小时前
Langflow:零基础快速上手AI流程可视化开发工具详解与实战案例
后端·面试·github
bobz9651 小时前
strongswan ipsec 端口使用
后端
陈哥聊测试1 小时前
这款自研底层框架,你说不定已经用上了
前端·后端·开源
m0_zj1 小时前
41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
开发语言·javascript·es6
海棠蚀omo1 小时前
C++笔记-list
开发语言·c++·笔记