Преобразование внутреннего массива go struct в сгенерированный protobuf массив указателей
Я пытаюсь преобразовать внутренний тип в тип, сгенерированный protobuf, и не могу получить массив для преобразования. Я новичок, поэтому не знаю всех методов, которые могли бы помочь. Но это моя попытка. При запуске этого кода я получаю
паника: ошибка во время выполнения: неверный адрес памяти или разыменование нулевого указателя [сигнал SIGSEGV: код нарушения сегментации =0x1 адрес =0x8 pc=0x86c724]
наряду со многими другими байтовыми данными. Мне интересно, как лучше всего конвертировать внутренние структуры в protobufs. Я думаю, что у меня больше всего проблем с созданным протобуфом кодом, являющимся указателями.
Прото Определения
message GameHistory {
message Game {
int64 gameId = 1;
}
repeated Game matches = 1;
string username = 2;
}
message GetRequest {
string username = 1;
}
message GetGameResponse {
GameHistory gameHistory = 1;
}
Go Code
// GameHistory model
type GameHistory struct {
Game []struct {
GameID int64 `json:"gameId"`
} `json:"games"`
UserName string `json:"username"`
}
func constructGameHistoryResponse(gameHistory models.GameHistory) *pb.GetGameResponse {
games := make([]*pb.GameHistory_Game, len(gameHistory.Games))
for i := range matchHistory.Matches {
games[i].GameID = gameHistory.Games[i].GameID
}
res := &pb.GetGameResponse{
GameHistory: &pb.GameHistory{
Games: games,
},
}
}
1 ответ
Ваш games
срез инициализируется с нулевыми значениями, так как он имеет тип []*pb.GameHistory_Game
(часть указателей на pb.GameGistory_Game - значение инициализации для указателя равно нулю). Вы хотите получить доступ к GameID
свойство этих элементов. Вы должны создать их вместо:
for i := range matchHistory.Matches {
games[i]=&pb.GameHistory{GameID: gameHistory.Games[i].GameID}
}
Кроме того, я рекомендую взглянуть на документацию go protobuf, так как у вас есть Marshal
а также Unmarshal
методы там для декодирования и кодирования сообщений protobuf.