技术文摘
Go 读文件的十种方法全总结
2024-12-31 03:27:04 小编
Go 读文件的十种方法全总结
在 Go 语言编程中,读取文件是一项常见的操作。下面为您详细总结 Go 读文件的十种方法。
方法一:使用 os.Open 和 ioutil.ReadAll 函数
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
file, err := os.Open("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err!= nil {
fmt.Println(err)
return
}
fmt.Println(string(data))
}
方法二:使用 bufio.NewReader 逐行读取
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err!= nil {
break
}
fmt.Println(line)
}
}
方法三:使用 os.ReadFile 函数
package main
import (
"fmt"
"os"
)
func main() {
data, err := os.ReadFile("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
fmt.Println(string(data))
}
方法四:结合 context 控制读取超时
package main
import (
"context"
"fmt"
"io"
"os"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
file, err := os.Open("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
select {
case <-ctx.Done():
fmt.Println("Timeout")
return
default:
line, err := reader.ReadString('\n')
if err!= nil {
break
}
fmt.Println(line)
}
}
}
方法五:分块读取文件
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
buffer := make([]byte, 1024)
for {
n, err := file.Read(buffer)
if err!= nil && err!= io.EOF {
fmt.Println(err)
return
}
if n == 0 {
break
}
fmt.Println(string(buffer[:n]))
}
}
方法六:使用 mmap 映射文件
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
file, err := os.Open("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
fileInfo, err := file.Stat()
if err!= nil {
fmt.Println(err)
return
}
size := fileInfo.Size()
data, err := syscall.Mmap(int(file.Fd()), 0, int(size), syscall.PROT_READ, syscall.MAP_PRIVATE)
if err!= nil {
fmt.Println(err)
return
}
defer syscall.Munmap(data)
fmt.Println(string(data))
}
方法七:通过通道读取文件
package main
import (
"fmt"
"os"
"time"
)
func readFileCh(fileName string, ch chan<- string) {
file, err := os.Open(fileName)
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err!= nil {
break
}
ch <- line
}
close(ch)
}
func main() {
ch := make(chan string)
go readFileCh("your_file.txt", ch)
for line := range ch {
fmt.Println(line)
}
}
方法八:结合文件锁读取
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
file, err := os.OpenFile("your_file.txt", os.O_RDONLY, 0666)
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
flock := syscall.Flock_t{
Type: syscall.F_RDLCK,
Whence: 0,
Start: 0,
Len: 0,
}
err = syscall.FcntlFlock(file.Fd(), syscall.F_SETLK, &flock)
if err!= nil {
fmt.Println(err)
return
}
// 读取文件内容
//...
err = syscall.FcntlFlock(file.Fd(), syscall.F_UNLCK, &flock)
if err!= nil {
fmt.Println(err)
return
}
}
方法九:使用 io.Copy 复制文件内容
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("your_file.txt")
if err!= nil {
fmt.Println(err)
return
}
defer file.Close()
var writer io.Writer
writer = os.Stdout
_, err = io.Copy(writer, file)
if err!= nil {
fmt.Println(err)
return
}
}
方法十:使用第三方库读取文件
例如,可以使用 github.com/mitchellh/go-homedir 等库来处理文件读取相关的操作。
以上就是 Go 语言读取文件的十种常见方法,您可以根据实际需求选择合适的方式。
- AngularJS自定义事件触发控制器中方法的方法
- JSP中与标签的区别是什么
- PHP变量不能通过URL传递的原因是什么
- AngularJS里my97日期选择器自定义事件kp()调用不了咋办
- WAMPServer 在线与离线模式的区别及离线仍可用的原因
- 最大化 FastAPI 效率:借助 py-cachify 极速实现缓存与锁定
- MySQL批量插入时避免重复数据及返回重复信息的方法
- Vue.js Ajax获取数据渲染异常,PHP返回JSON数据该如何正确处理
- Tomcat服务器在PC上可访问,在移动设备上却无法访问是为何
- PHP表单提交后无法获取变量值的原因
- PHP对象克隆在实际开发中的价值究竟有多大
- SVN提交时隐藏未版本化文件的方法
- window.open()方法失效,浏览器弹出窗口问题的解决方法
- PHP 7报错Call to undefined function mysqli_connect()的解决方法
- Go构建安全RAG应用程序:GoRag简介