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

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

當另一個包訪問時,Json 解組后結構為空

當另一個包訪問時,Json 解組后結構為空

Go
小唯快跑啊 2023-06-05 17:17:42
Contact我正在使用具有方法的結構Load()。這個想法是用數據Load()填充Contact的字段。數據從服務器返回的 json 中解組。加載后,我希望能夠訪問Contact.Load()我知道 json 正在正確解組,因為我可以在解組后立即將數據打印到控制臺。Contact但是,此數據一旦加載就不會出現。所以當我創建一個新的Contact并調用它的Load()方法時,當我去訪問它們時它的數據字段仍然是空的。這是我的代碼的簡化版本(為簡潔起見減去導入):package mainfunc main() {    client := &http.Client{}    mp := myPackage.NewContact("1234", client)    if err := mp.Load(); err != nil {        log.Println(err)    }    // prints empty string    log.Println(mp.EmailOptIn)}// myPackagepackage myPackagetype Contact struct {    ID          string    client      *http.Client    EmailOptIn  string      `json:"marketing_optin"`}func NewContact(ID string, client *http.Client) *Contact {    return &Contact{        ID:     ID,        client: client,    }}func (contact Contact) Load() error {    req, err := http.NewRequest("GET", "https://anAPI.com/"+contact.ID, nil)    if err != nil {        log.Println(err)    }    resp, err := contact.client.Do(req)    if err != nil {        log.Println(err)    }    defer resp.Body.Close()    if resp.StatusCode == 200 {        body, _ := ioutil.ReadAll(resp.Body)        if err = json.Unmarshal(body, &contact); err != nil {            log.Println("Can't unmarshall: " + err.Error())        }        // prints "Opted_in"        log.Println(contact.EmailOptIn)        return nil    }    return errors.New("oh dear")}
查看完整描述

1 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

Contact.Load()修改結構,所以為了保留更改,它必須有一個指針接收器:

func?(contact?*Contact)?Load()?error?{
????//?...
????}

所有參數(包括接收者)都按值傳遞,這意味著制作了一個副本,函數/方法只能對副本進行操作。如果接收者不是指針,則方法所做的所有更改都在方法返回時丟棄的副本上。

如果接收者是一個指針,它也會被復制,但是你不想修改指針而是指向的值,它會是一樣的。

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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