这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
基础语法
- 变量赋值 类型声明后置
= 是赋值, := 是声明变量并赋值
var a = "initial"
var b int = 1
c := a + "foo"
- if-else 不含(),后随{} swtich case不需要加break;
- 循环只有for
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
- 数组与切片 切片可变长度,即list
var a [5]int
b := [5]int{1, 2, 3, 4, 5}
var twoD [2][3]int
s := make([]string, 3)
c := make([]string, len(s))
copy(c, s)
good := []string{"g", "o", "o", "d"}
- map 哈希
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
- range 遍历
- 结构体 可以指针引用 结构体方法(类成员函数)
type user struct {
name string
password string
}
- 错误处理 一般函数都会返回错误内容
- 字符串操作 strconv.Atoi()实现字符串与数字的转换
- JSON处理、时间处理、进程信息
项目实战
猜谜游戏
基本实现思路很简单,首先系统生成一个随机数,然后循环读取用户输入,判断大小并返回信息。 注意点:生成随机数时以系统时间设置种子;使用bufio.NewReader()读取时以“\n”结尾,还要去除回车
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
修改猜谜游戏
要求用fmt.Scanf输入数字
func Scanf(format string, a ...interface{}) (n int, err error)
- Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。
- 本函数返回成功扫描的数据个数和遇到的任何错误。
值得注意的是,fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量
1.直接通过scanf循环读取guess的int值
var guess int
fmt.Scanf("%d", &guess)
这里存在问题,直接输入12,但是程序会进行两次读值。原因就是scanf是按照我们输入的模式串进行读值的,并不会对回车进行特殊处理。 我们第一次输入完成后,scanf读取guess为12,并留下回车在缓冲区。第二次读值时,直接读到回车,guess相当于没有读到值,因此为默认初始化的0值。
2.添加回车的特殊处理
fmt.Scanf("%d\n", &guess)
现在程序能正确读取int值,但是问题在于无法处理出错的情况,比如输入一个m,程序其实读到了一个m和一个回车,因此有两次赋值失败,输出了两次guess为0的初始值的情况
3.解决非法输入
- sancf会返回遇到的任何错误,因此我们用err接受并判错
- 针对非法输入的问题,还是要用字符串接受输入,再转为int
var input string
_, err := fmt.Scanf("%s\n", &input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
到这里,我们就实现了猜谜游戏的修改