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


