我想傳遞一個結構作為對函數的引用,并根據它的類型(由反射識別)進行適當的轉換并將值存儲在結構本身中。然而,雖然代碼運行,并且值在函數內部被識別和轉換,但當控件返回到函數 main() 時,該結構沒有我想存儲在那里的值。這是代碼:package mainimport ( "fmt" "reflect" "strconv")type x struct { f1 string f2 int f3 bool}func main() { s := x{} getData(&s.f1, "AAA") getData(&s.f2, "1") getData(&s.f3, "true") fmt.Println(s)}func getData(data interface{}, value string) { if value != "" { switch reflect.TypeOf(data).String() { case "*int": data, _ = strconv.Atoi(value) case "*bool": data, _ = strconv.ParseBool(value) case "*string": data = value } }}在這個例子中,我在{ 0 false}期待的同時得到{ AAA 1 true}是否有任何Golang GURU可以告訴我這段代碼做錯了什么?在去游樂場的鏈接下面 https://play.golang.org/p/l1_INJLOhAq
2 回答

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
使用類型開關根據值的類型執行代碼。在這種情況下不需要使用反射。
func getData(data interface{}, value string) {
? ? if value != "" {
? ? ? ? switch data := data.(type) {
? ? ? ? case *int:
? ? ? ? ? ? *data, _ = strconv.Atoi(value)
? ? ? ? case *bool:
? ? ? ? ? ? *data, _ = strconv.ParseBool(value)
? ? ? ? case *string:
? ? ? ? ? ? *data = value
? ? ? ? }
? ? }
}

慕后森
TA貢獻1802條經驗 獲得超5個贊
您需要使用reflect.Value.Elem()來獲取實際值而不是指針本身。
這是一個快速要點:
func getData(data interface{}, value string) {
? ? switch v := data.(type) {
? ? case *int:
? ? ? ? val := reflect.ValueOf(v).Elem()
? ? ? ? intVal, _ := strconv.Atoi(value)
? ? ? ? val.SetInt(int64(intVal))
? ? }
}
- 2 回答
- 0 關注
- 117 瀏覽
添加回答
舉報
0/150
提交
取消