为了账号安全,请及时绑定邮箱和手机立即绑定

当另一个包访问时,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 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信