项目实战 | 青训营笔记

124 阅读2分钟

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

猜谜游戏

主要知识点:

  • 随机数种子

使用 rand.Intn(n int) int 如果不设置rand.Seed()则默认设置的为rand.Seed(1),使用相同的值播种会导致每次运行的随机序列相同

Seed 使用提供的种子值将默认 Source 初始化为

确定性状态。 如果没有调用 Seed,则生成器的行为如下

如果由 Seed(1) 播种。 具有相同余数的种子值

除以 2³¹-1 生成相同的伪随机序列。

与 Rand.Seed 方法不同,Seed 对并发使用是安全的。

  • 命令行输入

    bufio

    创建一个reader对象,reader := bufio.NewReader(os.Stdin)

    这里os.Stdin是系统标准输入,就是从命令行中读取

    然后读取一行的数据input, err := reader.ReadString('\n'),这里的一行是用'\n'来控制的,也就是这个原因,不同系统中的换行符不一样,在linux系统中使用\n,在windows中应使用\r\n``reader.ReadString(b byte)是读到第一个b字节出现为止,且会将那一个字节读入字符串,返回读到的字符串

 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("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
         }
     }
 ​
 }
 ​

运行结果

屏幕截图 2022-05-07 180729.png

注意

rand.Seed(time.Now().UnixNano()) : 用时间戳来初始化随机数种子,否则随机数都会是相同的

rand.Intn(maxNum) : 生成maxNum以内的随机数

在线词典

主要要用到两个工具:

  • 通过彩云小译获取请求的cURL,通过第三方代码生成网站curlconverter.com/ 生成代码

屏幕截图 2022-05-07 183213.png

  • 通过代码生成网站:oktools.net 将JSON 转 Golang Struct

代码实现:

 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("app-name", "xy")
     req.Header.Set("Accept", "application/json, text/plain, */*")
 ​
     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)
 }

\