1 回答
TA貢獻1875條經驗 獲得超5個贊
你不能直接使用gob,但不要害怕勇敢的世界公民!
您可以在您的類型上實現BinaryMarshaler/BinaryUnmarshaler接口作為解決方法,gob 在編碼/解碼您的類型時會很樂意使用它們。
func (p *P) MarshalBinary() (_ []byte, err error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
enc.Encode(p.Name)
if p.Q == nil {
return buf.Bytes(), nil
}
isCyclic := p.Q != nil && p.Q.P == p
enc.Encode(isCyclic)
if isCyclic {
p.Q.P = nil
err = enc.Encode(p.Q)
p.Q.P = p
} else {
err = enc.Encode(p.Q)
}
//buf.Encode
return buf.Bytes(), err
}
func (p *P) UnmarshalBinary(data []byte) (err error) {
dec := gob.NewDecoder(bytes.NewReader(data))
if err = dec.Decode(&p.Name); err != nil {
return
}
var isCyclic bool
if err = dec.Decode(&isCyclic); err != nil {
return
}
err = dec.Decode(&p.Q)
if isCyclic {
p.Q.P = p
}
return
}
playground
警告每次創建新的解碼器/編碼器效率極低,您可能需要考慮使用binary.*.
- 1 回答
- 0 關注
- 244 瀏覽
添加回答
舉報
