আমি ডেভের উত্তরটি অভিযোজিত করেছি এবং একটি পুনরাবৃত্ত বৈশিষ্ট্য যুক্ত করছি। আমি এখনও আরও ব্যবহারকারী বান্ধব সংস্করণে কাজ করছি। উদাহরণস্বরূপ, মানচিত্রে একটি সংখ্যা স্ট্রিং স্ট্রাক্ট ইন ইন রূপান্তর করতে সক্ষম হওয়া উচিত।
package main
import (
"fmt"
"reflect"
)
func SetField(obj interface{}, name string, value interface{}) error {
structValue := reflect.ValueOf(obj).Elem()
fieldVal := structValue.FieldByName(name)
if !fieldVal.IsValid() {
return fmt.Errorf("No such field: %s in obj", name)
}
if !fieldVal.CanSet() {
return fmt.Errorf("Cannot set %s field value", name)
}
val := reflect.ValueOf(value)
if fieldVal.Type() != val.Type() {
if m,ok := value.(map[string]interface{}); ok {
if fieldVal.Kind() == reflect.Struct {
return FillStruct(m, fieldVal.Addr().Interface())
}
if fieldVal.Kind()==reflect.Ptr && fieldVal.Type().Elem().Kind() == reflect.Struct {
if fieldVal.IsNil() {
fieldVal.Set(reflect.New(fieldVal.Type().Elem()))
}
return FillStruct(m, fieldVal.Interface())
}
}
return fmt.Errorf("Provided value type didn't match obj field type")
}
fieldVal.Set(val)
return nil
}
func FillStruct(m map[string]interface{}, s interface{}) error {
for k, v := range m {
err := SetField(s, k, v)
if err != nil {
return err
}
}
return nil
}
type OtherStruct struct {
Name string
Age int64
}
type MyStruct struct {
Name string
Age int64
OtherStruct *OtherStruct
}
func main() {
myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = int64(23)
OtherStruct := make(map[string]interface{})
myData["OtherStruct"] = OtherStruct
OtherStruct["Name"] = "roxma"
OtherStruct["Age"] = int64(23)
result := &MyStruct{}
err := FillStruct(myData,result)
fmt.Println(err)
fmt.Printf("%v %v\n",result,result.OtherStruct)
}
encoding/json
যে আপনি মধ্যবর্তী পদক্ষেপটি করতে stdlib প্যাকেজটি ব্যবহার করছেন? .. আপনি কি এই উদাহরণটি ব্যবহার করতে পারেন এমন একটি মানচিত্র এবং উদাহরণ কাঠামো দিতে পারেন?