够浪发车第一天|青训营笔记

184 阅读3分钟

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

一、基于够浪实现猜数字游戏

1. 版本一

package main

import (
   "fmt"
   "math/rand"
)

func main() {
   maxNum := 100                     // 设置生成随机数的最大值
   secretNumber := rand.Intn(maxNum) // 生成一个小于maxNum的随机整数
   fmt.Println("The secret number is ", secretNumber)
}

这里我们会发现,生成的随机数字一直是81,因为我们没有设置随机数种子。

2. 版本二

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   maxNum := 100                     // 设置生成随机数的最大值
   rand.Seed(time.Now().UnixNano())  // 设置随机数种子,一般都是使用时间戳
   secretNumber := rand.Intn(maxNum) // 生成一个小于maxNum的随机整数
   fmt.Println("The secret number is ", secretNumber)
}

现在生成的随机数就不是固定的了。

3.版本三

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)
   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, "\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)
}

在此版本中,主要是增加了一些交互功能,让用户输入信息。

4. 版本四

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)
   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, "\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)
   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!")
   }
}

在这个版本中猜数字游戏才有点雏形了,不过还是不够,用户只能输入一次。

5. 版本五

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
      }
   }
}

至此,基于够浪实现的猜数字游戏才算完整实现

6. 版本六【作业】

package main

import (
   "fmt"
   "math/rand"
   "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")
   var input string
   count := 0
   for {
      _, err := fmt.Scanf("%s", &input)
      if err != nil {
         fmt.Println("An error occured while reading input. Please try again", err)
         continue
      }
      count++
      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.Printf("Correct, you Legend! and you input %d times", count)
         break
      }
   }
}

这个版本是基于版本五,只不过是把之前的用Reader读取用户输入信息换成fmt包实现。

基于够浪实现单词翻译

1. 原理

主要是使用第三方的翻译接口来实现,和爬虫类似。

2. 步骤

image.png

  • 打开抓包工具

image.png

  • 找到Network并点击XHR选项卡

image.png

  • 发送一次翻译请求

image.png

image.png

image.png

image.png

  • 大功告成

image.png

3. 代码实现

因为360翻译接口的原因,传入1表示英->中,传入0表示中->英

package main

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

type AutoGenerated struct {
   Data struct {
      Explain struct {
         EnglishExplain []interface{} `json:"english_explain"`
         Word           string        `json:"word"`
         Caiyun         struct {
            Info struct {
               Lbsynonym    []string      `json:"lbsynonym"`
               Antonym      []interface{} `json:"antonym"`
               WordExchange []interface{} `json:"word_exchange"`
            } `json:"info"`
         } `json:"caiyun"`
         RelatedWords []string `json:"related_words"`
         WordLevel    []string `json:"word_level"`
         Exsentence   []struct {
            Title string `json:"Title"`
            Body  string `json:"Body"`
            URL   string `json:"Url"`
         } `json:"exsentence"`
         Phonetic struct {
            NAMING_FAILED string `json:"英"`
         } `json:"phonetic"`
         WebTranslations []struct {
            Translation string `json:"translation"`
            Example     string `json:"example"`
         } `json:"web_translations"`
         Translation []string `json:"translation"`
         Speech      struct {
            a string `json:"美"`
            b string `json:"英"`
         } `json:"speech"`
      } `json:"explain"`
      Fanyi    string `json:"fanyi"`
      SpeakURL struct {
         SpeakURL     string `json:"speak_url"`
         TSpeakURL    string `json:"tSpeak_url"`
         WordSpeakURL string `json:"word_speak_url"`
         WordType     string `json:"word_type"`
      } `json:"speak_url"`
      Vendor string `json:"vendor"`
   } `json:"data"`
   Error int    `json:"error"`
   Msg   string `json:"msg"`
}

func query(eng string, word string) {
   client := &http.Client{}
   req, err := http.NewRequest("POST", fmt.Sprintf("https://fanyi.so.com/index/search?eng=%s&validate=&ignore_trans=0&query=%s", eng, word), nil)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("authority", "fanyi.so.com")
   req.Header.Set("accept", "application/json, text/plain, */*")
   req.Header.Set("accept-language", "en-GB,en;q=0.9,zh-CN;q=0.8,zh;q=0.7")
   req.Header.Set("content-length", "0")
   req.Header.Set("cookie", "QiHooGUID=D6D239C8B342B5A344CD62849BE69049.1651933029570; Q_UDID=14169c1b-9559-703f-7827-9265391766a9; __guid=144965027.1558171227539933000.1651933030305.476; count=1; __huid=114LIw9Nvn1GVXhcAW88WaeRZ9h1jKtNPRhrM1Q3CE4jo%3D; gtHuid=1")
   req.Header.Set("origin", "https://fanyi.so.com")
   req.Header.Set("pro", "fanyi")
   req.Header.Set("referer", "https://fanyi.so.com/")
   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)
   }
   autoGenerated := AutoGenerated{}
   err = json.Unmarshal(bodyText, &autoGenerated)
   if err != nil {
      return
   }
   fmt.Printf("%s\n", autoGenerated.Data.Fanyi)
}

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