前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go语言学习之读取用户输入

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

作者头像
张宗伟 plus
发布2023-01-04 14:08:17
5350
发布2023-01-04 14:08:17
举报
文章被收录于专栏:张宗伟 plus张宗伟 plus

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

代码语言: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: %s\n", 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: %s\n", err)
    }

    if input == "S\n" || input == "S\r\n" {
      fmt.Printf("letter_count: %d\n", letter_count)
      fmt.Printf("word_count: %d\n", word_count)
      fmt.Printf("line_count: %d\n", 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/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95
  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: %s\n", err)
    }

    switch {
    case input == "q":
      fmt.Printf("result: %d\n", 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
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 张宗伟 plus 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档