目录
一.引言
二.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 语言中的结构体。