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("用户取消操作")
  }
}