package main
import (
"encoding/json"
"fmt"
"reflect"
"strconv"
)
type fullName struct {
FName string `json:"fname"`
MName string `json:"mName"`
LName string `json:"lname"`
}
type people struct {
Name fullName
Sex string `json:"sex"`
Height int `json:"height"`
Weight int `json:"weight"`
}
func (p people) String() string {
return "my name is " + p.Name.FName + " " + p.Name.MName + " " + p.Name.LName + "," +
"sex is " + p.Sex + ",Height is " + strconv.Itoa(p.Height) + ",Weight is " + strconv.Itoa(p.Weight)
}
type cat struct {
Name fullName
Color string `json:"color"`
}
type dog struct {
Name fullName
Color string `json:"color"`
Breed string `json:"breed"`
}
func main() {
var p, pp people
p.Name = fullName{FName: "Fdog", MName: "Sdog", LName: "Ldog"}
p.Sex = "diaosi"
p.Height = 170
p.Weight = 60
fmt.Println("p:", p)
fmt.Println("pp:", pp)
setName(&p, &pp)
fmt.Println("p:", p)
fmt.Println("pp:", pp)
}
func setName(param interface{}, resp interface{}) {
// param 不同的参数输入 具有同一个Name结构体字段
full := reflect.ValueOf(param).Elem().FieldByName("Name") // Elem 获取接口包含的原始值
// 修改值
full.Set(reflect.ValueOf(fullName{FName: "FFdog", MName: "SSdog", LName: "LLdog"}))
b, _ := json.Marshal(full.Interface()) // 编码结构体的一部分
fmt.Println(string(b))
// 解码到结构体的指定字段
r := reflect.ValueOf(resp).Elem().FieldByName("Name")
err := json.Unmarshal(b, r.Addr().Interface()) // r是结构体Name对应的reflect.Value类型值
fmt.Println(err)
fmt.Println(r)
}
GO 通过反射修改有共同字段的不同结构体变量
最新推荐文章于 2023-05-28 01:11:35 发布