本学习笔记全部以代码块的形式展示,具体的内容都包含在代码里:
代码语言: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
}