GO语言基础-青训营第一课|青训营笔记

100 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。

一、基本语法

  1. go的“hello world",
import "fmt" //导包n
fmt.Println("hello world")
  1. 数据类型
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))
  1. for, if语句, go语言中并没有while, do while
for n := 0; n < 5; n++ {
   if n%2 == 0 {
      continue
   }
   fmt.Println(n)
}
for {
   fmt.Println("loop") //死循环
}
  1. 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")
}
  1. 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]
  1. 类型转换
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
   }
}

三、在线词典

以彩云词典为例,进行抓包分析:

image.png 从NetWork查看数据包,找到post且状态码为200的请求,并且response里JSON数据显示翻译结果。因为这个请求比较复杂,用代码构造比较麻烦,我们使用下面一种更为简单的方式。

首先右键浏览器里面的copy as curl。复制并粘贴到网站一后,利用工具生成代码:

网站一:curlconverter.com/#go

image.png

生成的代码我们直接复制到goland里面,有几个header比较复杂,可能会出现编译错误,删除即可。

image.png

运行代码,我们可以看到已经可以成功地发出请求并返回JSON数据。

image.png 现在问题,我们所要查询的单词不是固定的,而这里固定了单词“good”,那么如何修改呢?

首先,我们要构造一个结构体,这个结构体要和我们需要生成的JSON结构是一致的。

image.png

image.png

最后,我们只需要再定义一个变量和结构体中对应上,就可以使用输入单词查询了。

但最后输出的数据仍然是一团密密麻麻的数据,这不是我们想要的。我们只需要该单词的发音和翻译即可,因此,如何解析数据,是下一步的问题。

同样,对于返回的数据我们也要定义一个结构体,这里推荐网站二来自动解析response boby。 网站二:oktools.net/json2go

image.png 解析后的结构体:

image.png

根据需要取出想要的结果:

image.png

作业:

image.png

同理,根据上面流程,我增加了火山翻译引擎,并实现了并行运行。

结构体定义:

image.png

image.png

response boby解析:

image.png

并行操作:

image.png

运行结果:

image.png