我正在嘗試將帶有結構鍵的地圖存儲在文件中,因此我將其與 JSON 進行了轉換。但是我最終得到的地圖只有一個帶有零鍵的條目,以及原始地圖的最后一個值。(我這里的示例代碼不執行文件 I/O。)我查看了各種似乎有效的類似示例,但我看不出我哪里出錯了。import ( "encoding/json" "errors" "fmt")type XY struct { X int Y int}func (xy XY) String() string { return fmt.Sprintf("{X:%v, Y:%v}", xy.X, xy.Y)}func (xy XY) MarshalText() ([]byte, error) { text := []byte(fmt.Sprintf("%d,%d", xy.X, xy.Y)) fmt.Printf("Marshalled %v to %s\n", xy, text) return text, nil}func (xy XY) UnmarshalText(p []byte) error { n, err := fmt.Sscanf(string(p), "%d,%d", &xy.X, &xy.Y) if err != nil { return err } else if n != 2 { return errors.New("Cannot parse as XY: '" + string(p) + "'") } fmt.Printf("Unmarshalled %s to %v\n", p, xy) return nil}type XYMap = map[XY]stringfunc loadXY(data []byte, xymap XYMap) error { err := json.Unmarshal(data, &xymap) if err != nil { fmt.Println("unmarshal error:", err) } return err}func main() { xymap := make(XYMap) xymap[XY{1,2}] = "one two" xymap[XY{3,4}] = "three four" bytes, err := json.Marshal(xymap) fmt.Printf("xymap=%v \nbytes=%s err=%v\n", xymap, bytes, err) newxymap := make(XYMap) loadXY(bytes, newxymap) fmt.Printf("newxymap=%v\n", newxymap)}輸出:Marshalled {X:1, Y:2} to 1,2Marshalled {X:3, Y:4} to 3,4xymap=map[{X:1, Y:2}:one two {X:3, Y:4}:three four] bytes={"1,2":"one two","3,4":"three four"} err=<nil>Unmarshalled 1,2 to {X:1, Y:2}Unmarshalled 3,4 to {X:3, Y:4}newxymap=map[{X:0, Y:0}:three four]
1 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
您必須使用指針接收器來解組文本。
func (xy *XY) UnmarshalText(p []byte) error {
...
}
使用您當前的版本,UnmarshalText不會修改接收器,并且地圖最終會得到空鍵。
- 1 回答
- 0 關注
- 96 瀏覽
添加回答
舉報
0/150
提交
取消