Go - 9.struct 使用指南

2024-07-03 1288阅读

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 的互转: 

      Go - 9.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 语言中的结构体。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]