登录
首页 >  Golang >  Go问答

将 int32 类型的数据传递给 gRPC protobuf Enum 字段的方法

来源:stackoverflow

时间:2024-03-27 09:45:34 110浏览 收藏

在使用 gRPC protobuf 中的枚举字段时,将数据库中的 int32 数据类型值传递给它们可能会遇到挑战。通常,数据库中存储的权限类型是一个简单的 int() 值,如 0,表示“killnone”。直接尝试将此值扫描到 protobuf 结构中会导致错误。因此,作者提出了创建临时 int32 结构并先将数据库行扫描到其中,然后尝试将临时结构字段映射到 protobuf 结构。然而,这种方法也被证明不起作用。

问题内容

// 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 类型字段时,我遇到了类似的问题,但我用我的临时结构 []byte(tmp.uuid) 解决了这个问题。

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

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


解决方案


我通常在业务领域内使用 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 类型,但适配器似乎在该领域更常见。

终于介绍完啦!小伙伴们,这篇关于《将 int32 类型的数据传递给 gRPC protobuf Enum 字段的方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>