go语言学习之读取用户输入

2023-01-04 14:08:17 浏览数 (1)

本学习笔记全部以代码块的形式展示,具体的内容都包含在代码里:

代码语言:javascript复制
package types

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

// 读取输入
// 1. fmt.Scanln 和 fmt.Scanf 都是扫描来自标准输入的文本
// 2. Sscan 和以 Sscan 开头的函数则是从字符串读取
// 3. 也可以使用 bufio 包提供的缓冲读取(buffered reader)来读取数据
//     bufio.NewReader(os.Stdin) 将会创建一个读取器,并将其与标准输入绑定
//     ReadString(delim byte),该方法从输入中读取内容,直到碰到 delim 指定的字符,
//     然后将读取到的内容连同 delim 字符一起放到缓冲区

func Input() {
  var firstName, lastName string

  fmt.Println("请输入您的姓名:")

  // 1
  // fmt.Scanln(&firstName, &lastName)
  fmt.Scanf("%s %s", &firstName, &lastName)

  fmt.Println("您输入的名字是:", firstName lastName)

  var f float32
  var i int
  var s string
  value := "56.12 / 5212 / Go"
  // 2
  fmt.Sscanf(value, "%f / %d / %s", &f, &i, &s)
  fmt.Printf("f: %f, i: %d, s: %sn", f, i, s)

  // 3
  inputReader := bufio.NewReader(os.Stdin)

  fmt.Println("请输入您的工作:")

  work, err := inputReader.ReadString('n')
  if err != nil {
    fmt.Println("error occur...")
    return
  }
  fmt.Println("您输入的工作是:", work)

  // 练习
  wordLetterCount()
  calculator()
}

func wordLetterCount() {
  inputReader := bufio.NewReader(os.Stdin)

  fmt.Println("请您输入单词:")

  var letter_count int = 0
  var word_count int = 0
  var line_count int = 0

  // 使用for持续监听输入
  for {
    input, err := inputReader.ReadString('n')

    if err != nil {
      fmt.Printf("an error occurred: %sn", err)
    }

    if input == "Sn" || input == "Srn" {
      fmt.Printf("letter_count: %dn", letter_count)
      fmt.Printf("word_count: %dn", word_count)
      fmt.Printf("line_count: %dn", line_count)
      os.Exit(0)
    }

    letter_count  = len(input) - 2 // for /r /n
    word_count  = len(strings.Fields(input))
    line_count  = 1
  }
}

func calculator() {
  inputReader := bufio.NewReader(os.Stdin)

  // https://zh.wikipedia.org/wiki/逆波兰表示法
  fmt.Println("请按照逆波兰表达式格式输入数字和运算符:")

  // 构造一个栈
  // StackIns 见 接口及动态类型 笔记
  var stack = make(StackIns, 0)

  var result int

  for {
    input, err := inputReader.ReadString('n')

    // 去掉 r n
    input = input[0 : len(input)-1]

    if err != nil {
      fmt.Printf("an error occurred: %sn", err)
    }

    switch {
    case input == "q":
      fmt.Printf("result: %dn", result)
      os.Exit(0)
    case input >= "0" && input <= "999999":
      // 入栈
      stack.Push(input)
    case input == " ":
      intOp1, intOp2 := getOperators(stack)
      result = intOp2   intOp1
    case input == "-":
      intOp1, intOp2 := getOperators(stack)
      result = intOp2 - intOp1
    case input == "*":
      intOp1, intOp2 := getOperators(stack)
      result = intOp2 * intOp1
    case input == "/":
      intOp1, intOp2 := getOperators(stack)
      result = intOp2 / intOp1
    default:
      fmt.Println("invalid character!")
    }
  }
}

func getOperators(stack StackIns) (int, int) {
  op1, _ := stack.Pop()
  op2, _ := stack.Pop()
  intOp1, _ := strconv.Atoi(op1.(string))
  intOp2, _ := strconv.Atoi(op2.(string))
  return intOp1, intOp2
}

0 人点赞