Go - 9.struct 使用指南

目录

一.引言

二.struct 定义

三.struct 实践

1. 初始化 struct

2. 嵌套 struct

3. func 与 struct

四.struct 进阶

1.Json Tags

2.Other Tags

五.总结


一.引言

在编程中,结构体(struct)是一种聚合数据类型,用于将多个不同类型的值组合在一起。结构体在许多编程语言中都有类似的概念,Go 语言(简称 Go)也不例外。Go 语言中的 struct 提供了一种灵活且高效的方式来组织和管理复杂的数据。本文将详细介绍 Go 语言中的 struct,包括其定义、使用方法以及一些实际应用场景。

二.struct 定义

在 Go 语言中,struct 是一种用户定义的类型,用于将多个字段组合在一起。每个字段都有一个名称和类型。定义结构体的语法如下:

type StructName struct {
    FieldName1 FieldType1
    FieldName2 FieldType2
    // ...
}

其中:

  • StructName 是结构体的名称。
  • FieldName1 和 FieldName2 是字段的名称。
  • FieldType1 和 FieldType2 是字段的类型。

- 示例

package main

import "fmt"

// 定义一个名为 Person 的结构体
type Person struct {
    Name string
    Age  int
}

func main() {
    // 创建一个 Person 类型的实例
    p := Person{Name: "Alice", Age: 30}
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)
}

在这个示例中,我们定义了一个名为 Person 的结构体,它包含两个字段:Name 和 Age。然后,我们创建了一个 Person 类型的实例,并打印其字段值。

三.struct 实践

1. 初始化 struct

结构体可以通过多种方式初始化,包括使用字面量、使用字段名称初始化以及使用 new 函数。

- 使用字面量初始化

p := Person{"Alice", 30}

- 使用字段名初始化

p := Person{Name: "Alice", Age: 30}

- 使用 `new` 方法

p := new(Person)
p.Name = "Alice"
p.Age = 30

2. 嵌套 struct

结构体可以包含其他结构体作为字段,这称为嵌套结构体。以下是一个示例:

package main

import "fmt"

// 定义 Address 结构体
type Address struct {
    City, State string
}

// 定义 Person 结构体,包含 Address 作为字段
type Person struct {
    Name    string
    Age     int
    Address Address
}

func main() {
    // 创建一个 Person 类型的实例
    p := Person{
        Name: "Alice",
        Age:  30,
        Address: Address{
            City:  "New York",
            State: "NY",
        },
    }
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)
    fmt.Println("City:", p.Address.City)
    fmt.Println("State:", p.Address.State)
}

3. func 与 struct

结构体可以有方法,方法是与特定类型关联的函数。以下是一个示例:

package main

import "fmt"

// 定义 Person 结构体
type Person struct {
    Name string
    Age  int
}

// 为 Person 结构体定义一个方法
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 类型的实例
    p := Person{Name: "Alice", Age: 30}
    p.Greet()
}

在这个示例中,我们为 Person 结构体定义了一个名为 Greet 的方法,该方法打印一个问候消息。

四.struct 进阶

1.Json Tags

在 Go 语言中,结构体字段后面的反引号(``)部分称为标签(tags)。标签是一个字符串字面量,可以为结构体字段提供额外的元数据。标签通常用于与反射(reflection)一起使用,以便在运行时获取这些元数据。

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

Name 字段后面的标签 json:"name" 是一个 JSON 标签,用于指定在进行 JSON 编码和解码时,结构体字段应映射到的 JSON 键名。

- Tag 的作用

当你使用 encoding/json 包将结构体编码为 JSON 或从 JSON 解码为结构体时,JSON 标签会告诉编码器和解码器如何处理结构体字段。例如:

  • 编码:将结构体转换为 JSON 字符串时,Name 字段会被编码为 name 键。
  • 解码:将 JSON 字符串转换为结构体时,name 键的值会被解码到 Name 字段。

- 举个 🌰

package main

import (
	"encoding/json"
	"fmt"
)

// 定义结构体,并为字段添加 JSON 标签
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	// 创建一个结构体实例
	person := Person{
		Name: "Alice",
		Age:  30,
	}

	// 将结构体编码为 JSON 字符串
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error encoding JSON:", err)
		return
	}
	fmt.Println("JSON 编码结果:", string(jsonData))

	// 将 JSON 字符串解码为结构体
	jsonString := `{"name": "Bob", "age": 25}`
	var decodedPerson Person
	err = json.Unmarshal([]byte(jsonString), &decodedPerson)
	if err != nil {
		fmt.Println("Error decoding JSON:", err)
		return
	}
	fmt.Printf("JSON 解码结果: %+v\n", decodedPerson)
}

通过 Struct 和 Tags,我们可以快捷的实现 json 与 struct 的互转: 

2.Other Tags

除了 JSON 标签外,Go 语言中还有许多其他常见的标签,例如:

XML 标签:用于 encoding/xml 包。

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

数据库标签:用于与数据库 ORM(如 GORM)一起使用。

type User struct {
    ID   int    `gorm:"primary_key"`
    Name string `gorm:"column:user_name"`
}

验证标签:用于字段验证库(如 go-playground/validator)。

type User struct {
    Email string `validate:"required,email"`
    Age   int    `validate:"gte=0,lte=130"`
}

有兴趣的同学可以搜索自己的数据来源是否有与 Struct 匹配的解 Tag。

五.总结

结构体是 Go 语言中的一种重要数据类型,用于将多个不同类型的值组合在一起。通过使用 struct,我们可以定义复杂的数据结构,并为其添加方法以实现特定的行为。本文介绍了结构体的定义、初始化、嵌套结构体以及方法的使用,希望能帮助你更好地理解和使用 Go 语言中的结构体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值