Go语言基础 | 青训营笔记

90 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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")
		//去掉换行符
		input = strings.TrimSuffix(input, "\r")

		guess, err := strconv.Atoi(input)
		//转化为数字
		if err != nil {
			fmt.Println("Invalid input")
			continue
		}
		fmt.Println("Your 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
		}
	}
}


二、在线翻译词典

2.1 抓包

fanyi.caiyunapp.com/

fn+f12查看源代码-->输入单词点翻译-->找到dict(Headers.Request Method=Post的文件)-->找到Payload与Preview

image.png

image.png

image.png

2.2 代码生成

divt-->COPY-->COPY as cURL(bash) 复制粘贴到网站中的curl command:

curlconverter.com/#go

package main

import (
   "fmt"
   "io/ioutil"
   "log"
   "net/http"
   "strings"
)

func main() {
   client := &http.Client{}
   var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
   // 创建请求
   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)
   }
   fmt.Printf("%s\n", bodyText)
}

2.3 生成request body

此时输入是固定的,所以要用到Json序列化,构造一个json构造体,字段与json一致。

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

2.4 解析response body

Response复制代码到oktools.net/json2go 转换-嵌套成go,并且将改名成 DictResponse

image.png

将此时的DicResponse结构体添加到上面的代码中,删除最后一行输出,加上以下代码:

image.png

2.5 完善代码

1、import里添加"os"

2、将main()函数修改成query(word string)函数,Source原本的"good"改成变量word

image.png

3、重写一个main()

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

运行结果:

image.png

三、个人总结

个人感觉蛮有难度的,敲代码的时候也经常犯错555~~