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大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关推荐
IT90902 分钟前
Python-数据爬取(爬虫)
开发语言·爬虫·python
Demons_皮4 分钟前
python:ADB通过包名打开应用
开发语言·python·adb
AlexMercer101215 分钟前
[C++ 核心编程]笔记 4.2.6 初始化列表
开发语言·数据结构·c++·笔记·算法
lifejump16 分钟前
基于PHP的http字段查询与注册(V1)(持续迭代)
开发语言·php
喝旺仔la23 分钟前
Django后台接口开发
后端·python·django
程序员阿鹏24 分钟前
详解:模板设计模式
java·开发语言·jvm·后端·设计模式·eclipse·1024程序员节
wjs202424 分钟前
Lua 函数
开发语言
weixin_378410241 小时前
java springboot项目如何计算经纬度在围栏内以及坐标点距离
java·开发语言·spring boot
夜雨翦春韭1 小时前
【代码随想录Day54】图论Part06
java·开发语言·数据结构·算法·leetcode·图论
坠金1 小时前
激活函数/激活层
java·开发语言·servlet