
go 语言中处理三个相同结构体差异的技巧
包含三个相同结构体时,需要获取不同值并组合成新结构体的场景并不罕见。可以使用反射机制实现此目标。
反射提供了动态获取和操作结构体成员的强大功能。在 go 语言中,可以使用 reflect 包。
下面是一个处理此问题的示例代码:
程序采用ASP+ACCESS开发完成。中英繁三语言,所有页面采用UTF-8全球通用编码,兼容简体中文、繁体中文及英语,适用于中小企业网站运用。后台数据同时录入中文及英文,繁体采用JS自动转换,无需维护。免费版主要功能如下:·系统管理:系统综合设置、管理员管理、数据库备份、上传文件管理。·单页管理:自由无限制添加个性页面,如:公司简介、组织结构、联系我们等
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age uint8
Married bool
Hobbies []string
Education map[string]string
}
func main() {
// 创建三个结构体实例
a := Person{
Name: "John",
Age: 19,
Married: false,
Hobbies: []string{"dance", "music"},
Education: map[string]string{"university": "xx school"},
}
b := Person{
Name: "Jim",
Age: 19,
Married: false,
Hobbies: []string{"singing", "music"},
Education: map[string]string{"university": "xx school"},
}
c := Person{}
// 获取结构体的反射对象
aValue := reflect.ValueOf(a)
aType := reflect.TypeOf(a)
bValue := reflect.ValueOf(b)
cValue := reflect.ValueOf(&c) // 必须使用 c 的引用
// 循环遍历结构体字段
for i := 0; i < aValue.NumField(); i++ {
aField := aValue.Field(i) // 当前结构体成员的 Value 对象
aFieldType := aType.Field(i) // 当前结构体成员的成员 Type,用于获取字段名称
bField := bValue.Field(i)
fmt.Printf("%v: %v - %v\n", aFieldType.Name, aField.Interface(), bField.Interface())
fmt.Printf("========================\n")
// 切片和 map 不能直接比较,需要特殊处理
if aField.Kind() == reflect.Map {
aEdu := aField.Interface().(map[string]string)
bEdu := bField.Interface().(map[string]string)
fmt.Printf("%+v - %+v\n", aEdu, bEdu)
} else if aField.Kind() == reflect.Slice {
// ...
} else {
// 赋值给 c 的结构体
if aField.Interface() != bField.Interface() {
cValue.Elem().Field(i).Set(aField)
} else {
cValue.Elem().Field(i).Set(bField)
}
}
}
fmt.Printf("%+v\n", c)
}这个示例中,我们动态获取结构体的字段名称、类型和值,然后将不同值赋给新结构体 c。这样就可以轻松地处理三个相同结构体之间的差异。
立即学习“go语言免费学习笔记(深入)”;









