1 Star 0 Fork 3

Admin/golang-study

forked from gaozhichang/golang-study 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
zero_copy.go 1.73 KB
一键复制 编辑 原始数据 按行查看 历史
gaozhichang 提交于 2024-03-08 14:46 . 零拷贝,转拼音
// Package main
/*
@Time : 2024/3/8 11:32
@File : zero_copy.go
@des: GoLand
*/
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
// func() {
// // 创建文件
// f, err := os.Create("/tmp/source.txt")
// if err != nil {
// panic(err)
// }
// defer f.Close()
// // 写入数据
// _, err = f.WriteString("hello world!")
// if err != nil {
// panic(err)
// }
//
// f, err = os.Create("/tmp/dest.txt")
// if err != nil {
// panic(err)
// }
// defer f.Close()
// }()
// 设置源文件
src, err := os.Open("/tmp/source.txt")
if err != nil {
panic(err)
}
// defer src.Close()
// 设置目标文件
// dst, err := os.Open("/tmp/dest.txt")
// if err != nil {
// panic(err)
// }
// defer dst.Close()
dst := os.Stdout
// defer dst.Close()
// 发送文件
offset := int64(0)
// 使用 Sendfile 实现零拷贝 (拷贝 10 个字节)
// 如果因为字符编码导致的字符截断问题 (如中文乱码问题), 结果自动保留到截断前的最后完整字节
// 例如文件内容为 “星期三四五六七”,count 参数为 4, 那么只会拷贝第一个字 (一个汉字 3 个字节)
// 但是需要注意的是,方法的返回值 written 不受影响 (和 count 参数保持一致)
// 所以实际开发中,第三个参数 offset 必须设置正确,否则就可能引起乱码或数据丢失问题
fmt.Println("写入字节数: ", dst, int(dst.Fd()), src, int(src.Fd()), &offset)
n, err := syscall.Sendfile(int(dst.Fd()), int(src.Fd()), &offset, 10)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("写入字节数: %d", n)
// // 读取目标文件
// res := make([]byte, 10)
// _, err = dst.Read(res)
// fmt.Println(string(res))
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/chenweichu_1_0/golang-study.git
[email protected]:chenweichu_1_0/golang-study.git
chenweichu_1_0
golang-study
golang-study
main

搜索帮助