我有一个与protobuff序列化器一起使用的结构并且运行良好。
这个结构由protobuff生成,因此它有很多方法,比如Unmarshal等。
type Flight struct {
FlightNo string `json:"flightno, omitempty"`
Carrier string `json:"carrier, omitempty"`
}
func (m *Flight) Unmarshal(data []byte) error {
l := len(data)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowFlight
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
}
// some more code
}
然后我想在此航班信息中添加其他字段
type FlightMeta struct {
Source string `json:"source, omitempty"`
Destination string `json:"destination, omitempty"`
}
然后我结合了这两个结构,
type CombinedFlight struct {
Flight
FlightMeta
}
type ResponseFlight struct {
OnwardFlights []CombinedFlight `json:"onwardflights, omitempty"`
ReturnFlights []CombinedFlight `json:"returnflights, omitempty"`
Error string `json:"error, omitempty"`
}
所以当我读到一些数据时,
str "= `{"onwardflights": [{"flightno": "537", "carrier": "AI", "source": "BOM", "destination": "DEL"}], "error": "false"}`
respFlight = new(ResponseFlight)
err = json.Unmarshal([]byte(str), &respFlight)
fmt.Println("flightno:", respFlight.OnwardFlights[0].FlightNo, "flight source", respFlight.OnwardFlights[0].Source)
#prints "flightno:537 flight source:
它不会打印第二个结构的值,因为根据methis并不能正确地修改。
但是当我手动设置属性并编组(将其编码为json)时,这工作正常。 任何线索。?
答案 0 :(得分:0)
尝试这样做
type CombinedFlight1 struct {
Flight
FlightMeta
}
type CombinedFlight2 struct {
Flight
FlightMeta
}
type ResponseFlight struct {
OnwardFlights []CombinedFlight1 `json:"onwardflights, omitempty"`
ReturnFlights []CombinedFlight2 `json:"returnflights, omitempty"`
Error string `json:"error, omitempty"`
}
它会正常工作,如果你想编组,你必须创建两个不同的结构。有关更多信息,请参阅此帖子
访问Initialize nested struct definition in Golang if it have same objects