跳到主要内容

读取用户输入

前言

常见读取用户输入的方式有两种,一种是读取程序的命令行参数,另一种就是以交互形式请求用户输入。

读取命令行参数

常见读取命令行参数的方式有三种:

  • 按位置读取参数
  • 使用flag标准库
  • 使用cobra

这里仅举例说明如何按位置读取参数,这是最简单的读取方式。其他两种方式可分别参考flagcobra的文档。

package main

import (
"fmt"
"os"
)

func main() {
if len(os.Args) == 1 {
fmt.Println("Please give one or more arguments")
os.Exit(1)
}

// 第 0 号位参数是程序本身
args := os.Args[1:]

for i, v := range args {
fmt.Printf("index: %d, value: %s\n", i+1, v)
}
}

使用示例

> go run .\main.go 1 2 qwe asda szxczx
index: 1, value: 1
index: 2, value: 2
index: 3, value: qwe
index: 4, value: asda
index: 5, value: szxczx

交互读取用户输入

如果只是需要用户输入一个很简单的东西,用fmt.Scanf()就可以实现。不过fmt.Scanf()会将输入按空格分割,并只会取第一个输入。

package main

import (
"fmt"
)

func main() {
var name string
fmt.Print("Please enter your name: ")
fmt.Scanf("%s", &name)
fmt.Printf("Hello, %s!\n", name)
}

标准库bufio提供更强大的输入输出功能,通过以下方式可以正常读取到完整的输入

package main

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

func main() {
f := os.Stdin
defer f.Close()

fmt.Print("Please enter your name: ")
scanner := bufio.NewScanner(f)
if scanner.Err() != nil || !scanner.Scan() {
fmt.Println("error reading input")
os.Exit(1)
}
input := scanner.Text()
fmt.Printf("Hello, %s!\n", input)
}

循环读取用户输入方式1

package main

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

func main() {
f := os.Stdin
defer f.Close()

scanner := bufio.NewScanner(f)
for scanner.Scan() {
if err := scanner.Err(); err != nil {
fmt.Println("Read error")
continue
}
input := scanner.Text()
if len(input) == 0 {
fmt.Println("input is empty")
continue
}
if input == "exit" {
fmt.Println("bye")
break
}
fmt.Printf("> %s\n", input)
}
}

循环读取用户输入方式2

package main

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

func main() {
f := bufio.NewReader(os.Stdin)
for {
fmt.Print("Input< ")
input, err := f.ReadString('\n')
if err != nil {
fmt.Println("Read input error:", err)
continue
}
input = strings.TrimSpace(input) // 去除首尾空格
if len(input) == 0 {
fmt.Println("Input is empty")
continue
}

if input == "exit" {
fmt.Println("bye")
break
}
var inputFirst string
fmt.Sscan(input, &inputFirst) // 将input按空格分割,将第一个字符串赋值给 inputFirst

fmt.Printf("Output> %s\n", inputFirst)
}
}