猿问

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

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


Load()我知道 json 正在正确解组,因为我可以在解组后立即将数据打印到控制台。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")

}


小唯快跑啊
浏览 99回答 1
1回答

牧羊人nacy

Contact.Load()修改结构,所以为了保留更改,它必须有一个指针接收器:func (contact *Contact) Load() error {     // ...     }所有参数(包括接收者)都按值传递,这意味着制作了一个副本,函数/方法只能对副本进行操作。如果接收者不是指针,则方法所做的所有更改都在方法返回时丢弃的副本上。如果接收者是一个指针,它也会被复制,但是你不想修改指针而是指向的值,它会是一样的。
随时随地看视频慕课网APP

相关分类

Go
我要回答