GO 通过反射修改有共同字段的不同结构体变量

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)