GO语言实战之随机数、猜谜、字典 | 青训营笔记

113 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

一、随机数生成

  1. 设置范围
  2. 设置随机种子,每次生成随机数必须生成随机种子,不然随机数会一直是同一个。
  3. rand.intn 生成随机数
package main

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

func main() {
	maxNum := 100 //设置最大范围
	rand.Seed(time.Now().UnixNano()) //每次生成随机数必须生成随机种子,不然随机数会一直是同一个
	secretNumber := rand.Intn(maxNum) //生成随机数
	fmt.Println("The secret number is ", secretNumber)
}

二、猜谜游戏

  1. 生成随机数
  2. 读取输入,可用bufio或scanf。bufio每次读取一行以换行符结尾,然后使用trim函数去掉换行符,使用atoi函数转换为整数。
  3. if else 比较大小。若支持多次输入多次比较,则需要外套加入for循环,猜错则提示太大太小,猜中了则break跳出for循环。
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.Trim(input, "\r\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!")
	}
}

三、字典翻译

抓包复制浏览器的请求响应

以查询dance为例 image.png

image.png

curl to go 代码生成:

右键dict,复制curl(bash),粘贴到curlconverter.com/#go ,即可自动使用某语言(这里是GO)构造curl请求。

curl 'https://api.interpreter.caiyunai.com/v1/dict' \
  -H 'authority: api.interpreter.caiyunai.com' \
  -H 'sec-ch-ua: "Chromium";v="21", " Not;A Brand";v="99"' \
  -H 'os-version: ' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' \
  -H 'app-name: xy' \
  -H 'content-type: application/json;charset=UTF-8' \
  -H 'accept: application/json, text/plain, */*' \
  -H 'device-id: ' \
  -H 'os-type: web' \
  -H 'x-authorization: token:qgemv4jr1y38jyq6vhvi' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'origin: https://fanyi.caiyunapp.com' \
  -H 'sec-fetch-site: cross-site' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: https://fanyi.caiyunapp.com/' \
  -H 'accept-language: zh-CN,zh;q=0.9' \
  --data-raw '{"trans_type":"en2zh","source":"dance"}' \
  --compressed

转换后代码:

package main

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

func main() {
	client := &http.Client{}  
	var data = strings.NewReader(`{"trans_type":"en2zh","source":"dance"}`)
	req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("authority", "api.interpreter.caiyunai.com")
	req.Header.Set("sec-ch-ua", `"Chromium";v="21", " Not;A Brand";v="99"`)
	req.Header.Set("sec-ch-ua-mobile", "?0")
	req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 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("os-type", "web")
	req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
	req.Header.Set("sec-ch-ua-platform", `"Windows"`)
	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")
	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)
}
  1. 创建http客户端&http.Client{}
  2. 构造请求单词和类型。注意!这里必须使用流,如strings.NewReader,纯字符串可能会太长或转义出错
  3. 构造http请求http.NewRequest
  4. 设置各种请求头req.Header.Set
  5. 发送请求resp, err := client.Do(req)
  6. 打开延时函数,等待执行完毕再关闭,不然漏数据defer resp.Body.Close()。响应response 有它的HTTP状态码,response.header和response.body
  7. 读取数据流bodyText, err := ioutil.ReadAll(resp.Body)
  8. 返回结果如下

image.png

json格式化

先定义结构体,再定义一个变量,初始化每个结构体成员,再调用JSON.marshaler来得到这个序列化之后的结果。序列化后是一个字节数组,需要把strings.newReader 改成bytes.newReader。再构造HTTP请求。

返回的json转go结构体

image.png 复制返回的结构体粘贴进这个网址 oktools.net/json2go 选择嵌套,把生成的结构体定义结果复制到go文件即可。

解析json为结构体

定义一个结构体对象var dictResponse DictResponse。使用JSON.Unmarshal解析到结构体对象,记得带&指针类型才能传输。然后想要获取输出的某个字段,使用xxx.xxx.xxx(结构体1.结构体2.字段名)嵌套进去读取字段即可。 image.png