Contact我正在使用具有方法的結(jié)構(gòu)Load()。這個(gè)想法是用數(shù)據(jù)Load()填充Contact的字段。數(shù)據(jù)從服務(wù)器返回的 json 中解組。加載后,我希望能夠訪問Contact.Load()我知道 json 正在正確解組,因?yàn)槲铱梢栽诮饨M后立即將數(shù)據(jù)打印到控制臺。Contact但是,此數(shù)據(jù)一旦加載就不會出現(xiàn)。所以當(dāng)我創(chuàng)建一個(gè)新的Contact并調(diào)用它的Load()方法時(shí),當(dāng)我去訪問它們時(shí)它的數(shù)據(jù)字段仍然是空的。這是我的代碼的簡化版本(為簡潔起見減去導(dǎo)入):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貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
Contact.Load()
修改結(jié)構(gòu),所以為了保留更改,它必須有一個(gè)指針接收器:
func?(contact?*Contact)?Load()?error?{ ????//?... ????}
所有參數(shù)(包括接收者)都按值傳遞,這意味著制作了一個(gè)副本,函數(shù)/方法只能對副本進(jìn)行操作。如果接收者不是指針,則方法所做的所有更改都在方法返回時(shí)丟棄的副本上。
如果接收者是一個(gè)指針,它也會被復(fù)制,但是你不想修改指針而是指向的值,它會是一樣的。
- 1 回答
- 0 關(guān)注
- 150 瀏覽
添加回答
舉報(bào)
0/150
提交
取消