1
// 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,...)

该权限类型存储value = 0为默认类型的简单 MariaDB INT()。所以,我不能直接扫描它。因此Type int32,在尝试将临时结构字段映射到 protobuf 结构之后,我在哪里创建了临时结构并将行扫描到该临时结构中,但没有运气。当我想将 MariaDB 字符串值扫描到 []byte 类型字段时,我遇到了类似的问题,但我用我的 temp struct 解决了这个问题[]byte(tmp.UUID)

当使用非标准 protobuf 字段类型时,将数据库 ROW(单行)扫描到 protubuf 消息中的常见模式是什么?

编辑:是否应该有一些额外的0价值处理?

4

1 回答 1

1

我通常在业务领域中使用 Go 类型,并使用适配器与 protobuf 类型进行转换。

// 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 类型,但似乎适配器在该领域更常见。

于 2019-03-18T22:03:56.997 回答