Как установить член структуры динамически - PullRequest
0 голосов
/ 09 октября 2019

Сейчас я работаю над 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 ... для этой работы.

Итак, у меня есть вопросы:

  1. Почему объект в Code2 равен нулю?

  2. есть ли способ динамически установить объект-член Go struct?

1 Ответ

0 голосов
/ 09 октября 2019

Пожалуйста, посмотрите на этот документ, в котором содержится сгенерированный Go код для protobufs. https://developers.google.com/protocol-buffers/docs/reference/go-generated

Вы должны иметь возможность установить поле сообщения protobuf в сгенерированном коде, непосредственно обращаясь к соответствующему полю члена (которое экспортируется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...