Сейчас я работаю над GO RPC, я использую gRPC + Protobuf. И я следую за openconfig структурой данных, поэтому я НЕ МОГУ РЕДАКТИРОВАТЬ.
Мне нужно заполнить структуру protobuf и маршалировать ее и отправить ее, а затем клиент разархивирует ее и прочитает данные.
Мой файл protobuf (xxx.pb.go) сложен, например, так:
type ObjBase struct {
a *ObjChildAlice,
b *ObjChildBob,
... // there are many variables like ObjChildCheer, ObjChildDog ...
}
type ObjChildAlice struct {
child *ObjChildChild,
}
type ObjChildBob struct {
child *ObjChildChild,
}
// there are many types like ObjChildCheer, ObjChildDog ...
type ObjChildChild {
int i,
}
На стороне сервера мне нужно заполнить ObjBase
и отправить егоэто моя задача:
// Code 1
func () {
init ob with ObjBase
if DataBase has Alice {
fill ob.a with ObjChildAlice
}
if DataBase has Bob {
fill ob.a with ObjChildBob
}
// there are many if..else.. DataBase has Cheer...
return ob
}
Итак, сначала я кодирую так:
// Code 2
func () {
ob := new(ObjBase)
oba := new(ObjChildAlice)
obb := new(ObjChildBob)
if DataBase has Alice {
ob.a = oba
}
if DataBase has Bob {
ob.b = obb
}
...
return ob
}
Но этот код НЕ МОЖЕТ работать, так как я проверяю членов ob.a и ob. б все ноль.
Итак, я меняюсь так:
// Code 3
func () {
if DataBase has Alice && DataBase has Bob {
ob := &ObjBase{
a: &ObjChildAlice{},
b: &ObjChildBob{},
}
} else if DataBase has Alice && NOT DataBase has Bob {
ob := &ObjBase{
a: &ObjChildAlice{},
}
} else if ...
return ob
}
Это работает. Но в базе данных есть такие переменные, как Алиса, Боб, Приветствие, Собака ... Невозможно использовать if..else ... для этой работы.
Итак, у меня есть вопросы:
Почему объект в Code2 равен нулю?
есть ли способ динамически установить объект-член Go struct?