亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更改通過引用傳遞的結構的值

更改通過引用傳遞的結構的值

Go
慕容森 2023-05-04 16:08:16
我想傳遞一個結構作為對函數的引用,并根據它的類型(由反射識別)進行適當的轉換并將值存儲在結構本身中。然而,雖然代碼運行,并且值在函數內部被識別和轉換,但當控件返回到函數 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

? ? ? ? }

? ? }

}



查看完整回答
反對 回復 2023-05-04
?
慕后森

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))

? ? }

}


查看完整回答
反對 回復 2023-05-04
  • 2 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號