Go语言提供了完善的标准库支持文件输入相关的操作,无论是从终端的标准输入流读取数据,还是读取本地磁盘上的文件内容,都可以通过内置的包快速实现,下面分别介绍两种场景的具体实现方式。

一、从标准输入读取数据
标准输入通常指终端的输入流,Go语言中可以通过fmt包或者bufio包实现标准输入的读取,两种方式的适用场景有所不同。
1. 使用fmt包读取标准输入
fmt包的Scan、Scanln等函数可以直接从标准输入读取数据并赋值给变量,适合读取简单的格式化输入。
package main
import "fmt"
func main() {
var name string
var age int
// 从标准输入读取字符串和整数,空格分隔
fmt.Print("请输入姓名和年龄,用空格分隔:")
_, err := fmt.Scan(&name, &age)
if err != nil {
fmt.Println("读取输入失败:", err)
return
}
fmt.Printf("你输入的姓名是:%s,年龄是:%dn", name, age)
}
2. 使用bufio包读取标准输入
如果需要读取一整行内容,包括空格,使用bufio包的Reader会更合适,它可以按行读取输入内容。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 创建读取标准输入的Reader
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入一行内容:")
// 读取直到换行符的内容
line, err := reader.ReadString('n')
if err != nil {
fmt.Println("读取输入失败:", err)
return
}
// 输出读取到的内容,ReadString会包含换行符
fmt.Printf("你输入的内容是:%s", line)
}
二、读取本地文件内容
读取本地文件需要使用os包和io包的相关函数,根据文件大小和使用场景,可以选择不同的读取方式。
1. 一次性读取小文件
对于内容较小的文件,可以使用os.ReadFile函数一次性读取全部内容,这种方式代码简洁,不需要手动关闭文件。
package main
import (
"fmt"
"os"
)
func main() {
// 要读取的文件路径,这里使用相对路径
filePath := "test.txt"
// 一次性读取文件全部内容
content, err := os.ReadFile(filePath)
if err != nil {
fmt.Printf("读取文件%s失败:%vn", filePath, err)
return
}
// 将字节切片转换为字符串输出
fmt.Printf("文件%s的内容是:n%sn", filePath, string(content))
}
2. 分块读取大文件
如果文件体积较大,一次性读取会占用过多内存,此时可以使用os.Open打开文件,配合缓冲区分块读取。
package main
import (
"fmt"
"io"
"os"
)
func main() {
filePath := "large_file.txt"
// 打开文件,返回文件句柄
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("打开文件%s失败:%vn", filePath, err)
return
}
// 函数结束后关闭文件,释放资源
defer file.Close()
// 创建4KB大小的缓冲区
buf := make([]byte, 4096)
fmt.Printf("文件%s的内容是:n", filePath)
for {
// 从文件读取数据到缓冲区
n, err := file.Read(buf)
if err != nil {
// 读到文件末尾则退出循环
if err == io.EOF {
break
}
fmt.Printf("读取文件失败:%vn", err)
return
}
// 输出本次读取到的内容
fmt.Print(string(buf[:n]))
}
}
三、常见注意事项
- 读取文件时需要处理可能的错误,比如文件不存在、权限不足等情况,避免程序异常退出。
- 使用
os.Open打开文件后,一定要调用Close方法关闭文件,或者使用defer延迟关闭,防止资源泄露。 - 标准输入读取时,
fmt.Scan系列函数默认以空白字符作为分隔符,如果需要读取包含空格的整行内容,优先选择bufio.Reader的ReadString方法。 - 读取到的文件内容是字节切片类型,需要根据实际需求转换为字符串或者其他类型使用。