निम्नलिखित ठीक काम करता है:

type MyStruct struct {
    MyField int32
}

func SetReflectConcrete(obj *MyStruct, fieldName string, newValue interface{}) {
    objElem := reflect.ValueOf(obj).Elem()
    field := objElem.FieldByName(fieldName)
    field.Set(reflect.ValueOf(newValue))
}

func main() {
    myStruct := MyStruct{123}
    SetReflectConcrete(myStruct, "MyField", int32{1234})
}

मैं किसी भी संरचना पर काम करने वाले SetReflect फ़ंक्शन का एक प्रकार कैसे बना सकता हूं? मेरे अब तक के सभी प्रयास विफल रहे हैं। हस्ताक्षर कुछ इस प्रकार होगा:

func SetReflectInterface(obj interface{}, fieldName string, newValue interface{})

और क्या यह भी संभव है, इसे कॉल करने पर

SetReflectInterface(myStruct, "MyField", int32{1234})

या इसे इस तरह कहा जाना होगा

SetReflectInterface(&myStruct, "MyField", int32{1234})

(आखिरकार, interface{} के पास संरचना के लिए एक सूचक है।)

1
Evgeniy Berezovsky 28 अगस्त 2019, 08:39

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि आपने नोट किया है, तर्क को interface{} प्रकार के रूप में घोषित करें। अंतिम कोड स्निपेट की तरह स्ट्रक्चर में पॉइंटर पास करें।

func SetReflectConcrete(obj interface{}, fieldName string, newValue interface{}) {
    objElem := reflect.ValueOf(obj).Elem()
    field := objElem.FieldByName(fieldName)
    field.Set(reflect.ValueOf(newValue))
}

myStruct := MyStruct{123}
SetReflectConcrete(&myStruct, "MyField", int32(1234))

इसे खेल के मैदान पर चलाएं

फ़ील्ड सेट करने के लिए प्रतिबिंबित मान पता योग्य होना चाहिए। सीधे संरचना से बनाए जाने पर मान पता योग्य नहीं होगा।

1
Cerise Limón 28 अगस्त 2019, 08:47