如何将原始CSV字节响应反序列化为Go结构体?
gocsv反序列化字节CSV报错的解决方法
错误原因
gocsv.Unmarshal要求第一个参数必须是实现io.Reader接口的类型,但你传入的是字符串——string类型并没有实现io.Reader所需的Read方法,因此触发报错。另外,把字节数组转成字符串确实是多余操作,会额外占用内存。
正确实现代码
import "bytes" // 注意:要改成切片类型,因为CSV包含多行数据,单个结构体只能存一行 var actualResult []ESResponse body := util.GetResponseBody() // 直接用bytes.NewReader把字节包装成io.Reader,无需转字符串 err = gocsv.Unmarshal(bytes.NewReader(body), &actualResult)
重要提示
- 避免不必要的类型转换:
bytes.NewReader(body)直接将字节数组转为io.Reader,是处理字节流的最优方式,省去了字符串转换的内存开销。 - 结构体类型修正:原代码中
actualResult是单个ESResponse结构体,只能存储CSV的一行数据。如果要解析全部行,必须声明为切片[]ESResponse。 - 结构体Tag已正确配置:你定义的
ESResponse结构体中,csv:"element_a"这类Tag已经和CSV表头对应,无需修改。
内容的提问来源于stack exchange,提问作者hcp
相关产品推荐
相关产品推荐

