代码拉取完成,页面将自动刷新
同步操作将从 gaozhichang/golang-study 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
// Package main
/*
@Time : 2024/3/8 11:32
@Author : [email protected]
@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))
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。