Как вставить row.Scan () int32 в поле пробы Golang gRPC Enum? - PullRequest
0 голосов
/ 18 марта 2019
// agent.proto

message Agent {
    Permission permission = 1;
    google.protobuf.Timestamp born_time = 2;

    message Permission {
        Type type = 1;

        enum Type {
            KILLNONE = 0;
            KILLALL = 1;
            DANCE = 2;
        }
   }
}

Затем сканирует строку SQL в структуру protobuf агента:

// main.go

var a proto.Agent

.....

... row.Scan(&a.Permission.Type,...)

Этот тип разрешения сохраняется как простой MariaDB INT () value = 0 для типа по умолчанию.Так что я не могу сканировать это напрямую.Поэтому я сделал временную структуру, где Type int32, и просканировал строку в эту временную структуру после того, что попытался отобразить поля временной структуры в структуру protobuf, но безуспешно.Подобные проблемы у меня возникали, когда я хотел сканировать строковые значения MariaDB в поля типа байта [], но я решил это с моей временной структурой []byte(tmp.UUID).

Что такое общие шаблоны для сканирования базы данных ROW (одна строка) в сообщение protubufкогда используются нестандартные типы полей protobuf?

EDIT: Должна ли быть какая-то дополнительная 0 обработка значений?

1 Ответ

0 голосов
/ 19 марта 2019

Я обычно работаю с типами Go в бизнес-домене и использую адаптеры для преобразования в / из типа protobuf. * ​​1001 *

// Role represents a set of permissions
type Role struct {
    KILLNONE = iota
    KILLALL
    DANCE
}

// Permission represents a set of agent permissions
type Permission struct {
    Role Role
}

// ToProto converts a Permission Go type to a protobuf Permission
func (p Permission) ToProto() (proto.Permission) {
    pb := proto.Permission{}
    // assign p's properties to proto's respective properties
    // with necessary type conversions.
    ...
    return pb
}

Примеры protobuf обычно показывают работу с типами protobuf напрямую, но кажется, что адаптеры более распространены в полевых условиях.

...