当另一个软件包访问的结构是Json的解组后空

问题描述 投票:1回答:1

我现在用的是有一个Contact方法的结构Load()。这个想法是,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")
}
json go struct unmarshalling
1个回答
7
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.