我在Go中使用protobuf 3.14,试图更新一些嵌套字段,但它会引起恐慌:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x670028]
.proto文件:
syntax = "proto3";
option go_package = ".;my";
message My {
message _struct {
bytes Data = 1;
}
_struct Struct = 2; // e
}
go代码:
package main
import (
"aj/my"
)
func main() {
m := my.My{}
m.Struct.Data = []byte{1, 2, 3} // this causes panic, how to set it correctly?
}
我需要修改值,但是我在.pb中没有看到任何setter。去,如何修改它?
问题是m.Struct
只是一个指向_struct
类型的指针,它还没有初始化,所以你不能给它的Data
字段分配任何东西。
如果您查看My
消息生成的代码,它是这样的:
type My struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Struct *My_XStruct
}
所以Struct
类型是指向My_XStruct
的指针。你必须这样做:
m := my.My{}
m.Struct = &my.My_XStruct{}
m.Struct.Data = []byte{1, 2}