技术文摘
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 语言读取文件的十种常见方法,您可以根据实际需求选择合适的方式。
- Python 核心概念:导入、模块与包全解析
- Node 服务端应用路由解析(第二弹)
- 论前端领域的“门面”
- Python 线性顺序表的数据结构解析
- ArrayList 与 LinkedList 使用不当致使性能差异巨大
- .NET Core 授权失败时怎样自定义响应信息
- NET 中 JWT 的深入理解
- 你是否真正了解 C 语言中 Extern "C" 的作用
- Golang 语言 Struct 字段的 Tag 如何使用?
- Libuv 中 Io_Uring 的使用探讨
- Python 揭秘北京道路数量:多达 1.5 万条!
- Java 开发了解 HashMap 底层存储原理有益无害
- OAuth 2.0 为单纯授权协议,OIDC 系认证授权协议
- 为何不了解 AST ?
- 巧用责任链模式,提升代码逼格