You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用goavro库如何将Avro序列化数据还原为Golang原始结构体?

goavro 解码结果转自定义结构体方案

linkedin/goavro库的NativeFromBinary方法不会直接映射到Go结构体,Avro Record类型的解码结果默认是map[string]interface{}类型,你可以通过类型断言+字段映射的方式完成转换,完整示例代码如下:

codec, err := goavro.NewCodec(avro_schema_txt)
if err != nil {
    log.Fatal(err.Error())
}
out, _, err := codec.NativeFromBinary(data)
if err != nil {
    log.Fatal(err.Error())
}
// 第一步:断言解码结果为map[string]interface{}类型
record, ok := out.(map[string]interface{})
if !ok {
    log.Fatal("解码结果非预期的Avro Record类型")
}
// 第二步:初始化目标结构体
var target SimpleRecord
// 第三步:逐个字段映射赋值
// 处理int类型字段:Avro int对应Go的int32,需要转成int适配结构体定义
if f1Val, ok := record["f1"].(int32); ok {
    target.F1 = int(f1Val)
}
// 处理字符串类型字段
if f2Val, ok := record["f2"].(string); ok {
    target.F2 = f2Val
}
if f3Val, ok := record["f3"].(string); ok {
    target.F3 = f3Val
}
// 处理数组类型字段:Avro array对应Go的[]interface{},需要遍历转换为[]string
if depsRaw, ok := record["dependencies"].([]interface{}); ok {
    deps := make([]string, 0, len(depsRaw))
    for _, item := range depsRaw {
        if strItem, ok := item.(string); ok {
            deps = append(deps, strItem)
        }
    }
    target.Dependencies = deps
}
// 此时target即为转换完成的SimpleRecord实例
fmt.Println(target)

如果你有大量结构体需要转换,可以通过反射写通用映射方法,或者使用代码生成工具自动生成映射逻辑,避免重复手写字段映射代码。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:18:03