Golang中读取标准输入几种方式
使用 bufio.Scanner 逐行读取(最常用)
适用于读取一行行的数据,例如终端交互式输入。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("请输入内容:")
for scanner.Scan() {
text := scanner.Text()
fmt.Println("你输入的是:", text)
if text == "exit" {
break
}
fmt.Print("继续输入:")
}
}
使用 bufio.Reader 按字节或行读取(更灵活)
适用于读取大块数据或需要自定义分隔符的场景。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入内容:")
text, _ := reader.ReadString('\n')
fmt.Println("你输入的是:", text)
}
使用 os.Stdin.Read 读取固定大小的字节数据
适合低级别、按字节操作,例如二进制输入流。
package main
import (
"fmt"
"os"
)
func main() {
buf := make([]byte, 1024)
n, err := os.Stdin.Read(buf)
if err != nil {
fmt.Println("读取错误:", err)
return
}
fmt.Printf("读取了 %d 字节:%s\n", n, string(buf[:n]))
}
使用 io.ReadAll 一次性读取全部输入(适合管道、文件重定向)
适用于通过管道传输的 stdin,比如:echo hello | ./main
package main
import (
"fmt"
"io"
"os"
)
func main() {
data, err := io.ReadAll(os.Stdin)
if err != nil {
fmt.Println("读取错误:", err)
return
}
fmt.Printf("读取到全部内容:\n%s\n", data)
}
使用fmt.Scanf读取单次输入(最简单)
fmt.Scanf 是 Go 中最简单直接的标准输入函数之一,适合 **读取格式化的输入,比如字符串、整数、浮点数等,使用类似于 C 语言的格式占位符(如 %d、%s)。
package main
import (
"fmt"
)
func main() {
var name string
fmt.Printf("下面的操作需要你确认后继续,继续请输入[y/Y]:")
if _, err := fmt.Scanf("%s", &name); err != nil {
fmt.Println("输入有误!")
return
}
if name != "Y" && name != "y" {
fmt.Println("用户取消操作")
}
}