这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
入门
- slice可以声明后直接使用,map需要make分配内存
- if的判断条件,if v := x["two"]; v == "" {}
- string 类型的值是只读的二进制 byte slice,不能使用索引修改,但可以转为byte数组后修改
- range迭代map是无序的
- for循环
- for 循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量
- 引用类型包含切片(slice)、字典(map)、通道(channel)、接口(interface)
- 要复制一个Slice,最好使用Copy函数
案例:猜数字游戏
示例代码
package main
import (
"fmt"
"math/rand" "time")
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
// reader := bufio.NewReader(os.Stdin)
for {
var input int
_, err := fmt.Scanf("%d", &input)
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", input)
if input > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if input < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}
Go中的两种输入cli方法
1. fmt
1. fmt.Scanf
2. fmt.Scanln
3. fmt.Scan
scanf:按照给定的格式依次读取数据(包括非法数据),不能换行输入(如果要换行需要在前面加一个scanln吸收掉回车符,就像c语言中的getchar) scan:比scanf高级,依次读取数据,遇到回车会忽略,可以换行输入(如果要先用了scan输入,再用scanf输入的话,需要在中间加一个scanln) scanln:类似scan,但是遇到换行(回车)立马结束输入,如果要换行输入必须用多个scanln
2. bufio
首先使用bufio.NewReader创建reader对象 `reader := bufio.NewReader(os.Stdin)
1. ReadBytes n, err := reader.ReadBytes('\n') 2. ReadString line, err := reader.ReadString('\n')`
两个函数均会读如包含delim符号,是bufio读取输入时的常用函数