ในฐานะที่เป็น @chakrit กล่าวถึงในความคิดเห็นคุณจะไม่สามารถได้รับนี้ในการทำงานโดยการดำเนินการjson.Marshaler
เกี่ยวกับการMyStruct
และการใช้ฟังก์ชั่นนายอำเภอ JSON ที่กำหนดเองในทุก struct ที่ใช้ก็สามารถจะทำงานมากขึ้น ขึ้นอยู่กับกรณีการใช้งานของคุณว่าคุ้มค่ากับการทำงานพิเศษหรือไม่หรือคุณพร้อมที่จะใช้งานกับโครงสร้างที่ว่างเปล่าใน JSON ของคุณหรือไม่ แต่นี่คือรูปแบบที่ฉันใช้กับResult
:
type Result struct {
Data MyStruct
Status string
Reason string
}
func (r Result) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Data *MyStruct `json:"data,omitempty"`
Status string `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
}{
Data: &r.Data,
Status: r.Status,
Reason: r.Reason,
})
}
func (r *Result) UnmarshalJSON(b []byte) error {
decoded := new(struct {
Data *MyStruct `json:"data,omitempty"`
Status string `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
})
err := json.Unmarshal(b, decoded)
if err == nil {
r.Data = decoded.Data
r.Status = decoded.Status
r.Reason = decoded.Reason
}
return err
}
หากคุณมีโครงสร้างขนาดใหญ่ที่มีหลายฟิลด์สิ่งนี้อาจเป็นเรื่องน่าเบื่อโดยเฉพาะอย่างยิ่งการเปลี่ยนการใช้งานโครงสร้างในภายหลัง แต่ไม่สามารถเขียนjson
แพ็คเกจใหม่ทั้งหมดให้เหมาะกับความต้องการของคุณ (ไม่ใช่ความคิดที่ดี) นี่เป็นวิธีเดียวที่ฉันคิดได้ สิ่งนี้ทำได้ในขณะที่ยังคงไม่มีตัวชี้MyStruct
อยู่ที่นั่น
นอกจากนี้คุณไม่จำเป็นต้องใช้โครงสร้างแบบอินไลน์คุณสามารถสร้างโครงสร้างที่ตั้งชื่อได้ ฉันใช้ LiteIDE กับการเติมโค้ดดังนั้นฉันชอบอินไลน์เพื่อหลีกเลี่ยงความยุ่งเหยิง