使用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
相关产品推荐
相关产品推荐

