Golang Go语言中现有go项目接口response过大,如何将interface{}类型数据转为pb兼容编码

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中现有go项目接口response过大,如何将interface{}类型数据转为pb兼容编码
null

10 回复

[]byte + 类型枚举?

更多关于Golang Go语言中现有go项目接口response过大,如何将interface{}类型数据转为pb兼容编码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


补充一下,还可以用 pb 的 oneof 字段,了解一下

pb3 有个 any 类型,oneof 也可以,前者更通用

反射呀,有啥子问题,不解

json 压缩一下应该和二进制编码差不了多少。

手上有个项目,pb vs json gzip 差距还是不小的,明显 pb 在 response 的性能上有优势

只要你不用 encoding/json
其他的一些库,比如生成型的,或者虽然是反射,但是可以缓存 encoder 的 jsoniter 这些性能都跟 pb 差不多

楼主不妨多给点讯息,比如调用端是你在维护,还是其他地方?

在Go语言中,如果你的项目接口返回的response数据过大,并且希望将interface{}类型的数据转换为Protocol Buffers(简称PB)兼容的编码格式,以减小数据大小和提高传输效率,你可以按照以下步骤操作:

  1. 定义Protocol Buffers消息: 首先,根据你的数据结构定义相应的PB消息。这通常在一个.proto文件中完成。例如:

    message MyResponse {
        map<string, Any> data = 1;
    }
    

    其中Any是PB的一个类型,可以表示任意类型。

  2. 生成Go代码: 使用protoc编译器生成Go代码。命令可能如下:

    protoc --go_out=. --go-grpc_out=. yourfile.proto
    
  3. 序列化与反序列化: 在Go代码中,使用proto.Marshalproto.Unmarshal函数将你的interface{}数据序列化为PB格式,或从PB格式反序列化回来。由于interface{}的灵活性,你可能需要将其转换为具体的PB类型或使用Any类型包装。

  4. 使用Any类型: 如果你的数据结构是动态的,使用PB的Any类型来包装任意类型的数据,并在序列化时设置正确的类型URL。

  5. 优化接口设计: 考虑接口设计的优化,只返回必要的数据,避免传输过大的response。

通过上述步骤,你可以有效地将Go项目中的interface{}类型数据转换为PB编码,从而减小数据大小,提高传输效率。

回到顶部