第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何將接口轉(zhuǎn)換為結(jié)構(gòu)

如何將接口轉(zhuǎn)換為結(jié)構(gòu)

Go
心有法竹 2023-06-19 13:44:40
這是緩存的簡(jiǎn)化代碼。假設(shè)Container放在一個(gè)包里,所以它不知道Member。雖然我想在 Container 中存儲(chǔ) Member 的實(shí)例,所以我在 Container 中存儲(chǔ)一個(gè)空的 Member 實(shí)例作為outerType. 在 中Container->GetMysql,我通過(guò)測(cè)試值填充一個(gè)新變量(但在現(xiàn)實(shí)世界中,它通過(guò)數(shù)據(jù)庫(kù)的數(shù)據(jù)動(dòng)態(tài)填充)。然后在函數(shù)中Put,我將數(shù)據(jù)存儲(chǔ)在項(xiàng)目中作為緩存以供下次使用。在Get我得到存儲(chǔ)在項(xiàng)目中的數(shù)據(jù)。在此之前一切都很好。我的問(wèn)題是我想將 Get 的結(jié)果轉(zhuǎn)換為 Member 的類(lèi)型m = res.(Member)。我如何將它轉(zhuǎn)換為 Member 的實(shí)例我發(fā)現(xiàn)了很多關(guān)于這個(gè)主題的問(wèn)題,但沒(méi)有一個(gè)解決了我的問(wèn)題有關(guān)更多詳細(xì)信息:我想要Get返回?cái)?shù)據(jù)及其在項(xiàng)目中存儲(chǔ)位置的指針。因此,如果我得到同一成員的一些變量,其中一個(gè)的變化會(huì)顯示在其他成員中package mainimport (    "fmt"    "reflect")type Member struct {    Id     int    Name   string    Credit int    Age    int}type Container struct {    outerType interface{}    items     map[string]*interface{}}func (cls *Container)GetMysql(s string, a int64) interface{}{    obj := reflect.New(reflect.TypeOf(cls.outerType))    elem := obj.Elem()    //elem := reflect.ValueOf(o).Elem()    if elem.Kind() == reflect.Struct {        f := elem.FieldByName("Name")        f.SetString(s)        f = elem.FieldByName("Credit")        f.SetInt(a)    }    return obj.Interface()}func (cls *Container)Get(value string) *interface{}{    return cls.items[value]}func (cls *Container)Put(value string, a int64) {    res := cls.GetMysql(value, a)    cls.items[value] = &res}func main() {    c := Container{outerType:Member{}}    c.items = make(map[string]*interface{})    c.Put("Jack", 500)    res := c.Get("Jack")    fmt.Println(*res)    m := &Member{}    m = res.(Member) // Here is the problem. How to convert ?    fmt.Println(m)}
查看完整描述

1 回答

?
猛跑小豬

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊

您幾乎不應(yīng)該使用指向接口的指針。我的建議是永遠(yuǎn)不要使用它,當(dāng)你需要它時(shí),你就會(huì)知道。


相反,如果你需要一個(gè)指向某物的指針(這樣你就可以在多個(gè)地方擁有相同的指針,因此在某處修改指向的值,它會(huì)對(duì)其他地方產(chǎn)生影響),在接口值中“包裝指針”。


因此,首先修改該items字段,使其存儲(chǔ)interface{}值而不是指針:


items map[string]interface{}

這意味著沒(méi)有限制:您可以傳遞和存儲(chǔ)指針,這不是問(wèn)題。


接下來(lái)修改Get()返回interface{}:


func (cls *Container) Get(value string) interface{}{

    return cls.items[value]

}

并且在 中Put(),不要獲取以下地址interface{}:


func (cls *Container) Put(value string, a int64) {

    res := cls.GetMysql(value, a)

    cls.items[value] = res

}

并且您必須*Member根據(jù) 返回的值進(jìn)行類(lèi)型斷言Get()。


現(xiàn)在測(cè)試它:


c := Container{outerType: Member{}}

c.items = make(map[string]interface{})

c.Put("Jack", 500)

res := c.Get("Jack")

fmt.Println(res)

m := res.(*Member) // Here is the problem. How to convert ?

fmt.Println(m)

輸出(在Go Playground上嘗試):


&{0 Jack 500 0}

&{0 Jack 500 0}

現(xiàn)在,如果您要修改以下字段m:


m.Credit = 11

然后從緩存中獲取值:


fmt.Println(c.Get("Jack"))

我們將看到修改后的值,即使我們沒(méi)有調(diào)用(在Go PlaygroundPut()上嘗試):


&{0 Jack 11 0}


查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 134 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)