Go语言实战项目之猜谜游戏、命令行词典(改编)| 青训营笔记

261 阅读14分钟

简介:

这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记。
本篇文章是基于青训营5月7日的课程所展开的。该课程给我们分享了三个实战项目,分别是:猜谜游戏、命令行词典、SOCKS5代理;对于该三个实战项目,我后面会对前两个项目进行介绍,第三个有点难度,自己还得再深入理解一下,其次,课程结尾留有三个实战作业,我也完成了并进行记录于本文。

前提知识

在阅读本文之前,读者需要熟悉Go语言的基本语法,并能够进行相应的编码即可。

前言

在开展本文之前,我先给大家贴出本次课程的作业,以方便大家带着思考去阅读本文。

5c2cba9ababb404cb18c4e26a4913f8a_tplv-k3u1fbpfcp-watermark.image

1. 猜谜游戏

该项目是基于一个简单的猜数字游戏,系统随机一个整数,玩家输入数字进行猜数环节,同时,系统也会给玩家进行相应的提示,比如玩家输入的数字比系统随机出的整数要大,就提示输入的数字过大,然后玩家根据系统提示进行相应的调整。

1.1 代码解析

由于系统要随机一个整数,因此我们得在程序里写一个生成随机数的方法,其GO语言的实现是:

maxNum := 100                            
rand.Seed(time.Now().UnixNano())         // 设置时间种子,每次生成随机数保证大概率不相同
secretNumber := rand.Intn(maxNum)

构造一个输入流,用于接收用户的输入情况,同时定义相关逻辑(用户输入的数比随机数要大,提示相应的信息)

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.TrimSuffix(input, "\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
   }
}

1.2 完整代码

package main

import (
   "bufio"
   "fmt"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "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 {
      input, err := reader.ReadString('\n')
      if err != nil {
         fmt.Println("An error occured while reading input. Please try again", err)
         continue
      }
      input = strings.TrimSuffix(input, "\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。下面就是由我完成代码的详细情况:

1.3 猜谜游戏作业

package main

import (
   "fmt"
   "math/rand"
   "time"
)
func randNum(maxNum int) int{
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   return secretNumber
}
func doWork(guess int,secretNumber int) bool{
   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!")
      return true
   }
   return false
}
func main() {
   secretNumber := randNum(100)
   fmt.Println("Please input your guess")
   //reader := bufio.NewReader(os.Stdin)
   for {
      var guess int
      _,err := fmt.Scanf("%d",&guess)
      if err != nil{
         fmt.Println("An error occured while reading input. Please try again", err)
         continue
      }
      flag := doWork(guess,secretNumber)
      if flag{
         break
      }
   }
}

换成fmt.Scanf后代码整洁好多了,当然还有很多相应的Scanf知识点需要自己学习与提高。

2. 命令行词典

这个项目代码有点多,而且好多代码是相应的工具生成的,我先贴一下课程里完整的代码,然后在此基础上完成一个程序对另一种翻译引擎的支持。

2.1 完整代码

package main

import (
   "bytes"
   "encoding/json"
   "fmt"
   "io/ioutil"
   "log"
   "net/http"
   "os"
)

type DictRequest struct {
   TransType string `json:"trans_type"`
   Source    string `json:"source"`
   UserID    string `json:"user_id"`
}

type DictResponse struct {
   Rc   int `json:"rc"`
   Wiki struct {
      KnownInLaguages int `json:"known_in_laguages"`
      Description     struct {
         Source string      `json:"source"`
         Target interface{} `json:"target"`
      } `json:"description"`
      ID   string `json:"id"`
      Item struct {
         Source string `json:"source"`
         Target string `json:"target"`
      } `json:"item"`
      ImageURL  string `json:"image_url"`
      IsSubject string `json:"is_subject"`
      Sitelink  string `json:"sitelink"`
   } `json:"wiki"`
   Dictionary struct {
      Prons struct {
         EnUs string `json:"en-us"`
         En   string `json:"en"`
      } `json:"prons"`
      Explanations []string      `json:"explanations"`
      Synonym      []string      `json:"synonym"`
      Antonym      []string      `json:"antonym"`
      WqxExample   [][]string    `json:"wqx_example"`
      Entry        string        `json:"entry"`
      Type         string        `json:"type"`
      Related      []interface{} `json:"related"`
      Source       string        `json:"source"`
   } `json:"dictionary"`
}

func query(word string) {
   client := &http.Client{}
   request := DictRequest{TransType: "en2zh", Source: word}
   buf, err := json.Marshal(request)
   if err != nil {
      log.Fatal(err)
   }
   var data = bytes.NewReader(buf)
   req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("Connection", "keep-alive")
   req.Header.Set("DNT", "1")
   req.Header.Set("os-version", "")
   req.Header.Set("sec-ch-ua-mobile", "?0")
   req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
   req.Header.Set("app-name", "xy")
   req.Header.Set("Content-Type", "application/json;charset=UTF-8")
   req.Header.Set("Accept", "application/json, text/plain, */*")
   req.Header.Set("device-id", "")
   req.Header.Set("os-type", "web")
   req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
   req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
   req.Header.Set("Sec-Fetch-Site", "cross-site")
   req.Header.Set("Sec-Fetch-Mode", "cors")
   req.Header.Set("Sec-Fetch-Dest", "empty")
   req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
   req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
   req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
   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 dictResponse DictResponse
   err = json.Unmarshal(bodyText, &dictResponse)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
   for _, item := range dictResponse.Dictionary.Explanations {
      fmt.Println(item)
   }
}

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

2.2 命令行词典作业

2.2.1 百度翻译词典

首先,我们进入百度翻译界面,然后打开开发者模式,点击下图的页面

3e47be0ec8eb4dbfb8960979ab7317df_tplv-k3u1fbpfcp-watermark.image

右键,然后找到Copy选项,然后再选择Copy as cURL(bash)选项,拷贝即可,然后再打开网站

d420c9b511cc476b88f0722cd5c13b96_tplv-k3u1fbpfcp-watermark.image

拷贝生成的代码,复制到编辑器。然后再打开百度翻译界面,打开开发者模式

16840a36c97841e7b4fa5bf4747e63a1_tplv-k3u1fbpfcp-watermark.image

复制里面的内容,然后再打开网站,将JSON转Golang Struct

!

e094925da0624bc39710baf8256f9059_tplv-k3u1fbpfcp-watermark.image 复制代码,粘贴到编译器上,然后根据其JSON形式转换为Golang Struct,输出控制台即可,下面我给出自己的完整代码:

package main

import (
   "bufio"
   "encoding/json"
   "fmt"
   "io/ioutil"
   "log"
   "net/http"
   "os"
   "strings"
)
type Request struct{
   Query string `json:"query"`
}
type Response struct {
   Errno int `json:"errno"`
   Data []struct {
      K string `json:"k"`
      V string `json:"v"`
   } `json:"data"`
}
func query(word string){

      client := &http.Client{}
      request := Request{Query: word}
      var data = strings.NewReader("kw="+request.Query)
      req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
      if err != nil {
         log.Fatal(err)
      }
      req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
      req.Header.Set("Accept-Language", "en,zh-CN;q=0.9,zh;q=0.8")
      req.Header.Set("Connection", "keep-alive")
      req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
      req.Header.Set("Cookie", "BIDUPSID=66573F2C764AC16ED6A94E4B7DECDEE9; PSTM=1616301299; __yjs_duid=1_6338bae02f4f58f8e78fd24ba12a41cc1618904684298; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_WISE_SIDS=110085_127969_131861_176399_177371_178384_178612_179349_179379_179425_180276_181481_181588_182252_182530_183328_184042_184320_184361_184560_184793_184891_184894_185029_185241_185268_185305_185517_185638_185749_185872_185879_185890_186159_186317_186411_186596_186662_186716_186840_187022_187061_187186_187282_187292_187391_187417_187433_187449_187532_187567_187669_187725_187726_187816_187928_187958_188060_188414_188425_188468_188614_188733_188749_188805_188832_188846_188870_188898_189071_189268_189295_189419; APPGUIDE_10_0_2=1; BDUSS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BDUSS_BFESS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BAIDUID=7B46454C3E6C78A9ADF03FC72E57A1A2:SL=0:NR=10:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=0405a58k0la18k81td1h7ai4k0q; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=2; BCLID=10319960442745530237; BDSFRCVID=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; BCLID_BFESS=10319960442745530237; BDSFRCVID_BFESS=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1650872219,1651250467,1651906887; BAIDUID_BFESS=9926C39CD39BF9C785AC1260B76D10B6:FG=1; H_PS_PSSID=36182_36309_31660_36004_36166_34584_35978_35802_36233_26350_36314_36061; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1651912910; ab_sr=1.0.1_YmYyNGU2YzMyNzIwMmRkMmM2Y2E2M2Y3ZGYzODNjMTNmMTE0ODAxYjFkMDM1M2VkNTI3MzkwMGIzZDNjZDlhOTAwNmNmYmE4MjAxOTA4MDRjZTJkMWFhZDNhNmE0ZjlmNjUxMTdhN2Y2YTA1MjUwM2RlYTQyNjliYmFhNjQzN2ZjMTliNWQ2MzE2Nzc2ZWQwMzNiMjE0ZjZlMjIzNGFmNzE5MWE2MzE1ZDgyYzkwYmU5NTJjYWI5MjEwOWU5N2Y4")
      req.Header.Set("Origin", "https://fanyi.baidu.com")
      req.Header.Set("Referer", "https://fanyi.baidu.com/?aldtype=16047")
      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")
      req.Header.Set("X-Requested-With", "XMLHttpRequest")
      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"`)
      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 response Response
      err = json.Unmarshal(bodyText,&response)
      if err!=nil{
         log.Fatal(err)
      }
      for _,item := range response.Data{
         fmt.Println(item.V)
      }
}
func main() {

   for{
      fmt.Println("请输入您要翻译的英文单词:(-1代表退出)")
      reader := bufio.NewReader(os.Stdin)
      res,_,err := reader.ReadLine()
      if err != nil{
         fmt.Println("reader.ReadLine() error:", err)
      }
      if string(res) == "-1"{
         fmt.Println("程序已退出")
         break
      }
      fmt.Println("翻译结果如下:")
      query(string(res))
   }
}

运行结果如下:

GM_$T6H7PZID@C50FXJT{}6.png

3. 并发请求两个翻译引擎提高响应速度

上述,我们已经有两个程序分别是原有的(针对彩云科技翻译),现写的(百度翻译),我们在Go的main函数下可以启动两个线程,分别执行翻译,然后先得出结果的直接返回即可,这样可以提高响应速度,由于个人在Go并发方面没有深入学习,我就加了一个全局变量Num = 1,如果一个线程执行完毕,num减一,另一个线程如果发现num<1时,直接退出。这种方法局限性很高,不建议使用,待个人深入学习后,会加以改造。下面会我的代码:

package main

import (
   "bufio"
   "bytes"
   "encoding/json"
   "fmt"
   "io/ioutil"
   "log"
   "net/http"
   "os"
   "strings"
)
var num = 1
type DictRequest struct {
   TransType string `json:"trans_type"`
   Source    string `json:"source"`
   UserID    string `json:"user_id"`
}

type DictResponse struct {
   Rc   int `json:"rc"`
   Wiki struct {
      KnownInLaguages int `json:"known_in_laguages"`
      Description     struct {
         Source string      `json:"source"`
         Target interface{} `json:"target"`
      } `json:"description"`
      ID   string `json:"id"`
      Item struct {
         Source string `json:"source"`
         Target string `json:"target"`
      } `json:"item"`
      ImageURL  string `json:"image_url"`
      IsSubject string `json:"is_subject"`
      Sitelink  string `json:"sitelink"`
   } `json:"wiki"`
   Dictionary struct {
      Prons struct {
         EnUs string `json:"en-us"`
         En   string `json:"en"`
      } `json:"prons"`
      Explanations []string      `json:"explanations"`
      Synonym      []string      `json:"synonym"`
      Antonym      []string      `json:"antonym"`
      WqxExample   [][]string    `json:"wqx_example"`
      Entry        string        `json:"entry"`
      Type         string        `json:"type"`
      Related      []interface{} `json:"related"`
      Source       string        `json:"source"`
   } `json:"dictionary"`
}

func query1(word string){
   client := &http.Client{}
   request := DictRequest{TransType: "en2zh", Source: word}
   buf, err := json.Marshal(request)
   if err != nil {
      log.Fatal(err)
   }
   var data = bytes.NewReader(buf)
   req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("Connection", "keep-alive")
   req.Header.Set("DNT", "1")
   req.Header.Set("os-version", "")
   req.Header.Set("sec-ch-ua-mobile", "?0")
   req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
   req.Header.Set("app-name", "xy")
   req.Header.Set("Content-Type", "application/json;charset=UTF-8")
   req.Header.Set("Accept", "application/json, text/plain, */*")
   req.Header.Set("device-id", "")
   req.Header.Set("os-type", "web")
   req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
   req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
   req.Header.Set("Sec-Fetch-Site", "cross-site")
   req.Header.Set("Sec-Fetch-Mode", "cors")
   req.Header.Set("Sec-Fetch-Dest", "empty")
   req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
   req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
   req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
   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 dictResponse DictResponse
   err = json.Unmarshal(bodyText, &dictResponse)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
   for _, item := range dictResponse.Dictionary.Explanations {
      fmt.Println(item)
   }
   num--
}

type Request2 struct{
   Query string `json:"query"`
}
type Response2 struct {
   Errno int `json:"errno"`
   Data []struct {
      K string `json:"k"`
      V string `json:"v"`
   } `json:"data"`
}
func query2(word string){
   if num == 0{
      return
   }
   client := &http.Client{}
   request := Request2{Query: word}
   var data = strings.NewReader("kw="+request.Query)
   req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
   req.Header.Set("Accept-Language", "en,zh-CN;q=0.9,zh;q=0.8")
   req.Header.Set("Connection", "keep-alive")
   req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
   req.Header.Set("Cookie", "BIDUPSID=66573F2C764AC16ED6A94E4B7DECDEE9; PSTM=1616301299; __yjs_duid=1_6338bae02f4f58f8e78fd24ba12a41cc1618904684298; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_WISE_SIDS=110085_127969_131861_176399_177371_178384_178612_179349_179379_179425_180276_181481_181588_182252_182530_183328_184042_184320_184361_184560_184793_184891_184894_185029_185241_185268_185305_185517_185638_185749_185872_185879_185890_186159_186317_186411_186596_186662_186716_186840_187022_187061_187186_187282_187292_187391_187417_187433_187449_187532_187567_187669_187725_187726_187816_187928_187958_188060_188414_188425_188468_188614_188733_188749_188805_188832_188846_188870_188898_189071_189268_189295_189419; APPGUIDE_10_0_2=1; BDUSS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BDUSS_BFESS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BAIDUID=7B46454C3E6C78A9ADF03FC72E57A1A2:SL=0:NR=10:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=0405a58k0la18k81td1h7ai4k0q; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=2; BCLID=10319960442745530237; BDSFRCVID=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; BCLID_BFESS=10319960442745530237; BDSFRCVID_BFESS=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1650872219,1651250467,1651906887; BAIDUID_BFESS=9926C39CD39BF9C785AC1260B76D10B6:FG=1; H_PS_PSSID=36182_36309_31660_36004_36166_34584_35978_35802_36233_26350_36314_36061; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1651912910; ab_sr=1.0.1_YmYyNGU2YzMyNzIwMmRkMmM2Y2E2M2Y3ZGYzODNjMTNmMTE0ODAxYjFkMDM1M2VkNTI3MzkwMGIzZDNjZDlhOTAwNmNmYmE4MjAxOTA4MDRjZTJkMWFhZDNhNmE0ZjlmNjUxMTdhN2Y2YTA1MjUwM2RlYTQyNjliYmFhNjQzN2ZjMTliNWQ2MzE2Nzc2ZWQwMzNiMjE0ZjZlMjIzNGFmNzE5MWE2MzE1ZDgyYzkwYmU5NTJjYWI5MjEwOWU5N2Y4")
   req.Header.Set("Origin", "https://fanyi.baidu.com")
   req.Header.Set("Referer", "https://fanyi.baidu.com/?aldtype=16047")
   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")
   req.Header.Set("X-Requested-With", "XMLHttpRequest")
   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"`)
   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 response Response2
   err = json.Unmarshal(bodyText,&response)
   if err!=nil{
      log.Fatal(err)
   }
   if num == 0{
      return
   }
   for _,item := range response.Data{
      fmt.Println(item.V)
   }
   num--
}

func main() {
   for{
      num = 1
      reader := bufio.NewReader(os.Stdin)
      res,_,err := reader.ReadLine()
      if nil!=err{
         fmt.Println("reader.ReadLine() error:", err)
      }
      go query2(string(res))
      go query1(string(res))



   }
}

4.总结

本次课程让我熟悉了Go语言的语法,以及简单的项目实战,同时在这两个项目实战中,深刻体会到了Go语言的简洁与方便。