gpt4 book ai didi

json - 当另一个包访问时,Json 解码后结构为空

转载 作者:IT王子 更新时间:2023-10-29 01:49:53 24 4
gpt4 key购买 nike

我正在使用具有 Load() 方法的结构 Contact。这个想法是 Load() 用数据填充 Contact 的字段。数据从服务器返回的 json 中解码。加载后,我希望能够访问 Contact 上的数据。

我知道 json 正在正确解码,因为我可以在数据解码后立即在 Load() 中将数据打印到控制台。但是,此数据在加载后不会出现在 Contact 上。所以当我创建一个新的 Contact 并调用它的 Load() 方法时,当我去访问它们时它的数据字段仍然是空的。

这是我的代码的简化版本(为简洁起见减去了导入):

package main

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

}

// myPackage

package myPackage

type 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")
}

最佳答案

Contact.Load() 修改结构,所以为了保留更改,它必须有一个指针接收器:

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

所有参数(包括接收者)都是按值传递的,这意味着制作了一个副本,函数/方法只能对副本进行操作。如果接收者不是指针,则方法所做的所有更改都在方法返回时丢弃的副本上。

如果接收者是一个指针,它也会被复制,但是你不想修改指针而是指向的值,这将是相同的。

查看相关/可能的重复项:

My object is not updated even if I use the pointer to a type to update it

Remove an element of a slice in a struct

关于json - 当另一个包访问时,Json 解码后结构为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54532448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com