Go语言中字节数组与IO流互转?通过读写器跨函数传递字节数组
在Go中实现字节数组与IO流的转换及函数间传递
嗨,我来帮你搞定这个Go里的字节数组和IO流转换问题~先帮你纠正下原代码里的小语法错误,再一步步讲清楚如何实现转换和函数间传递。
先修正原代码的错误
你原来的代码里有两处问题:
[]byte{"data"}是语法错误,应该写成[]byte("data")(用双引号而非花括号)stdout.Bytes()看起来是笔误,应该直接使用定义好的bytearray变量
修正后的基础代码框架是这样的:
import "bytes" func main() { bytearray := []byte("data") reader := bytes.NewReader(bytearray) transfer(reader) }
从io.Reader转回字节数组的几种方法
你的transfer函数需要从传入的reader还原出原字节数组,这里有几种常用方案:
方法1:用io.ReadAll(推荐,Go 1.16+支持)
这是最简洁通用的方法,不管传入的是*bytes.Reader还是其他实现了io.Reader的类型(比如文件流),都能直接读取所有内容:
import ( "bytes" "io" "log" ) func transfer(reader io.Reader) { bytearray, err := io.ReadAll(reader) if err != nil { log.Fatalf("读取失败: %v", err) } // 现在bytearray就是原字节数组了 log.Println("还原后的内容:", string(bytearray)) // 输出 "还原后的内容: data" }
方法2:针对*bytes.Reader的优化方案
如果你的transfer函数确定只接收*bytes.Reader类型,可以利用它的Len()方法提前知道字节长度,然后直接分配缓冲区读取,效率更高:
import ( "bytes" "log" ) func transfer(reader *bytes.Reader) { // 提前获取字节数组长度 buf := make([]byte, reader.Len()) _, err := reader.Read(buf) if err != nil { log.Fatalf("读取失败: %v", err) } log.Println("还原后的内容:", string(buf)) }
方法3:用bytes.Buffer通过io.Writer传递
如果你的场景更适合用io.Writer来传递数据(比如需要逐步写入内容),可以用bytes.Buffer作为中间载体,写入后直接提取字节数组:
import ( "bytes" "log" ) func main() { bytearray := []byte("data") var buf bytes.Buffer // 将字节数组写入Buffer(实现了io.Writer接口) _, err := buf.Write(bytearray) if err != nil { log.Fatalf("写入失败: %v", err) } transfer(&buf) } func transfer(writer *bytes.Buffer) { // 从Buffer中直接获取字节数组 bytearray := writer.Bytes() log.Println("还原后的内容:", string(bytearray)) }
总结一下核心转换逻辑
- 字节数组 → io.Reader:使用
bytes.NewReader(bytearray)直接转换 - io.Reader → 字节数组:优先用
io.ReadAll(reader),通用且简洁;如果是特定的*bytes.Reader可以用Len()+Read的方式优化 - 通过io.Writer传递:用
bytes.Buffer作为中间容器,写入后用Bytes()方法提取原字节数组
内容的提问来源于stack exchange,提问作者mohd.gadi
相关产品推荐
相关产品推荐

