【青训营】Go语言上手以及作业总结 | 青训营笔记

232 阅读4分钟

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

1 课程分布

分为简介、入门、实战,笔记主要记录入门与实战部分,方便回过头来查找比较重要的方法。

1、1 Go语言入门

go的开发环境除了常用的goland编辑器之外还有云开发。

关于switch的用法,go里面也有default,但无需添加break语句。

重点:数组与切片的区别:数组的长度是固定的,更多的是使用切片,可以使用append方法来扩容,这是一个比较重要的区别。

重点:range的用法,range中会有两个元素,第一个是索引,第二个是所需要循环的列表中的单个对象

例如本次作业中需要循环打印结果:

for _,word := range res.Words {
   fmt.Println(word.Text)
   for _,posList := range word.PosList {
      for _,explanation := range posList.Explanations {
         fmt.Println("翻译:",explanation.Text)
         for i,example := range explanation.Examples {
            for _,sentence:= range example.Sentences {
               fmt.Println("例子",i+1,":",sentence.Text,"翻译:",sentence.TransText)
            }
         }
      }
   }
}

go也拥有指针,与C与C++有所区别,支持的操作有限。当不使用指针时,去改变函数变量会改变失败,使用指针才能对变量进行修改,并且调用的时候需要加上&。

字符串常用的一些操作:

1、len()用来统计一个字符串的长度

2、strconv.Atoi()将一个字符串转化为一个整数

3、strconv.ItoA() 将一个整数转化为一个字符串

4、strconv.FormatInt(i int,base b) 将十进制转化为其他进制(2到32进制)

5、strings.Contains(BigStr string,littleStr string)

6、strings.Count(s, str string)

7、strings.ToLower(s)、stings.ToUpper(s) 将字符串进行大小写的变化

8、stringArr string[] = strings.Split(s,str) 将一个字符串按照指的的分隔符分割为一个字符串数组

1、2 实战

作业1、猜谜游戏

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   //fmt.Println("The secretNumber is ",secretNumber)

   fmt.Println("请输入你猜的数据")
   for {
      var guess int
      _, err := fmt.Scanf("%d", &guess)
      if err != nil {
         fmt.Println("invalid input please try again",err)
         return
      }
      if guess > secretNumber {
         fmt.Println("your guess is bigger,please try again")
      }else if guess < secretNumber {
         fmt.Println("your guess is smaller,please try again")
      }else {
         fmt.Println("your guess is correct")
         break
      }
   }
}

fmt的scanf函数即可获取用户的输入,与C语言类似,并且使用rand的时候要为rand用时间戳来初始化随机数种子,并且通过if、else来判断用户的输入,在外层添加一层循环,用户输入正确后即结束循环。

运行结果:

图片.png

作业2 字典

先记录几个好用的网站

https://oktools.net/json2go

可以将json格式的数据转换为go的结构体代码。

https://curlconverter.com/#go

可以将curl命令转为go的代码,包括设置请求头,发送请求等。

在这次作业我使用的是火山翻译。

translate方法如下,main函数调用与示例代码一致:

func translate(word string,wg *sync.WaitGroup) {
   defer wg.Done()
   client := &http.Client{}
   request := DataRequestPayload{
      Text: word,
      Language: "en",
   }
   buffer, err := json.Marshal(request)
   if err != nil {
      log.Fatal(err)
   }
   var data = bytes.NewReader(buffer)
   req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/match/v1/?msToken=&X-Bogus=DFSzswVYQDcCwfLhSWy8he9WX7je&_signature=_02B4Z6wo000016wY5cAAAIDDLBofgZYfqMusGOFAAImInJGNxMHkObRmOW27znoFrRp59Pr3oiQ45nB2oXE-eMa0Dz-VAizNyTYLGmWBb-l98uMszTZjT2vuTt8edtD0.ojCwge-BTnYlBte79", data)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("authority", "translate.volcengine.com")
   req.Header.Set("accept", "application/json, text/plain, */*")
   req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8")
   req.Header.Set("content-type", "application/json")
   req.Header.Set("cookie", "x-jupiter-uuid=16521128243516392; s_v_web_id=verify_fce0853ccefd86e3be0a95977f655732; _tea_utm_cache_2018=undefined; ttcid=2a5f43a2c891402baf7f285e9ec5548e18; tt_scid=4rbYd03MlL7IfS8WBfvHzyK7Kdoz-bwGMjexgDHamN4yeuBv4wLnf.NTw3eAuq5d8b09; i18next=translate")
   req.Header.Set("origin", "https://translate.volcengine.com")
   req.Header.Set("referer", "https://translate.volcengine.com/translate?category=&home_language=zh&source_language=detect&target_language=zh&text=hello")
   req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"`)
   req.Header.Set("sec-ch-ua-mobile", "?0")
   req.Header.Set("sec-ch-ua-platform", `"Windows"`)
   req.Header.Set("sec-fetch-dest", "empty")
   req.Header.Set("sec-fetch-mode", "cors")
   req.Header.Set("sec-fetch-site", "same-origin")
   req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
   resp, err := client.Do(req)
   if err != nil {
      log.Fatal(err)
   }
   defer resp.Body.Close()
   bodyText, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      log.Fatal(err)
   }
   if resp.StatusCode != 200 {
      log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
   }
   var res ResultResponse
   err = json.Unmarshal(bodyText, &res)
   if err != nil {
      log.Fatal(err)
   }
   for _,word := range res.Words {
      fmt.Println(word.Text)
      for _,posList := range word.PosList {
         for _,explanation := range posList.Explanations {
            fmt.Println("翻译:",explanation.Text)
            for i4,example := range explanation.Examples {
               for _,sentence:= range example.Sentences {
                  fmt.Println("例子",i4+1,":",sentence.Text,"翻译:",sentence.TransText)
               }
            }
         }
      }
   }
}

结构体就不一一展示了,复制浏览器的response去上面那个网站转换为结构体即可。

运行结果:

图片.png

作业3 并行请求

通过waitgroup即可实现

image.png done方法可以使add中添加的计数器减一,wait方法等计数器置0即可往下进行。

main方法如下:

func main() {
   if len(os.Args) != 2 {
      fmt.Fprintf(os.Stderr, `usage: simpleDict WORD example: simpleDict hello
      `)
      os.Exit(1)
   }
   wg := sync.WaitGroup{}
   wg.Add(2)
   word := os.Args[1]
   query(word,&wg)
   translate(word,&wg)
}

query使用的是示例代码中的,只需添加参数并且defer wg.Done()即可。

image.png

image.png

运行结果:

图片.png