Go 控制台输入处理

控制台输入方法

Go 语言提供了多种处理控制台输入的方法,每种方法都有其特点和适用场景。

1. fmt.Scan 系列

fmt.Scan 系列函数是最简单的输入方法,适合简单的输入场景。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
    var name string
    var age int
    
    // 读取字符串
    fmt.Print("请输入姓名: ")
    fmt.Scan(&name)
    
    // 读取整数
    fmt.Print("请输入年龄: ")
    fmt.Scan(&age)
    
    fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
}

2. bufio.Scanner

bufio.Scanner 提供了更灵活的输入处理方式,适合处理多行输入。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    
    // 读取一行
    fmt.Print("请输入姓名: ")
    scanner.Scan()
    name := scanner.Text()
    
    // 读取整数
    fmt.Print("请输入年龄: ")
    scanner.Scan()
    age, _ := strconv.Atoi(scanner.Text())
    
    fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
}

3. bufio.Reader

bufio.Reader 提供了底层的输入控制,适合需要精确控制输入的场景。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    
    // 读取一行(包含换行符)
    fmt.Print("请输入姓名: ")
    name, _ := reader.ReadString('\n')
    name = strings.TrimSpace(name)
    
    // 读取单个字符
    fmt.Print("请输入性别 (M/F): ")
    gender, _ := reader.ReadByte()
    
    fmt.Printf("姓名: %s, 性别: %c\n", name, gender)
}

4. io.ReadAll

io.ReadAll 用于一次性读取所有输入,适合处理完整的输入流。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    // 读取所有输入直到 EOF
    input, _ := io.ReadAll(os.Stdin)
    fmt.Printf("输入内容:\n%s", input)
}

使用建议

  1. 简单输入

    • 使用 fmt.Scan 系列函数
    • 适合基本的用户输入
  2. 多行输入

    • 使用 bufio.Scanner
    • 适合处理文本文件或复杂输入
  3. 精确控制

    • 使用 bufio.Reader
    • 适合需要特殊输入处理的场景
  4. 完整输入流

    • 使用 io.ReadAll
    • 适合处理管道或重定向输入

参考资源

57.12k 字
43篇文章