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?{ ????//?... ????}
所有參數(包括接收者)都按值傳遞,這意味著制作了一個副本,函數/方法只能對副本進行操作。如果接收者不是指針,則方法所做的所有更改都在方法返回時丟棄的副本上。
如果接收者是一個指針,它也會被復制,但是你不想修改指針而是指向的值,它會是一樣的。
- 1 回答
- 0 關注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消