这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
一、基本语法
- go的“hello world",
import "fmt" //导包n
fmt.Println("hello world")
- 数据类型
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialapple
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
- for, if语句, go语言中并没有while, do while
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for {
fmt.Println("loop") //死循环
}
- switch语句, 与c不同, case后不用加break
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
- slice切片,不定长数组,要注意与java不同,append后要赋值给切片
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d") //append后要重新赋值
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
- 类型转换
f, _ := strconv.ParseFloat("1.234", 64)
fmt.Println(f) // 1.234
n, _ := strconv.ParseInt("111", 10, 64)
fmt.Println(n) // 111
n, _ = strconv.ParseInt("0x1000", 0, 64)
fmt.Println(n) // 4096
n2, _ := strconv.Atoi("123")
fmt.Println(n2) // 123
n2, err := strconv.Atoi("AAA")
fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax
二、 猜谜游戏
规则:随机生成一个1到100内的数,猜数字,如果猜的数大了,提示bigger,小了提示smaller,直到猜中,game over。
注意随机数的生成,要初始化随机种子,否则一直都是第一次生成的值:
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
实现代码:
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
return
}
input = strings.TrimSuffix(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is", guess)
作业(使用Scanf简化代码):
fmt.Println("Please input your guess")
//reader := bufio.NewReader(os.Stdin)
var guess int
for {
_, err := fmt.Scanf("%d", &guess)
//fmt.Println(value)
//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
}
}
三、在线词典
以彩云词典为例,进行抓包分析:
从NetWork查看数据包,找到post且状态码为200的请求,并且response里JSON数据显示翻译结果。因为这个请求比较复杂,用代码构造比较麻烦,我们使用下面一种更为简单的方式。
首先右键浏览器里面的copy as curl。复制并粘贴到网站一后,利用工具生成代码:
生成的代码我们直接复制到goland里面,有几个header比较复杂,可能会出现编译错误,删除即可。
运行代码,我们可以看到已经可以成功地发出请求并返回JSON数据。
现在问题,我们所要查询的单词不是固定的,而这里固定了单词“good”,那么如何修改呢?
首先,我们要构造一个结构体,这个结构体要和我们需要生成的JSON结构是一致的。
最后,我们只需要再定义一个变量和结构体中对应上,就可以使用输入单词查询了。
但最后输出的数据仍然是一团密密麻麻的数据,这不是我们想要的。我们只需要该单词的发音和翻译即可,因此,如何解析数据,是下一步的问题。
同样,对于返回的数据我们也要定义一个结构体,这里推荐网站二来自动解析response boby。 网站二:oktools.net/json2go
解析后的结构体:
根据需要取出想要的结果:
作业:
同理,根据上面流程,我增加了火山翻译引擎,并实现了并行运行。
结构体定义:
response boby解析:
并行操作:
运行结果: