这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、随机数生成
- 设置范围
- 设置随机种子,每次生成随机数必须生成随机种子,不然随机数会一直是同一个。
- 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)
}
二、猜谜游戏
- 生成随机数
- 读取输入,可用bufio或scanf。bufio每次读取一行以换行符结尾,然后使用trim函数去掉换行符,使用atoi函数转换为整数。
- 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为例
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)
}
- 创建http客户端&http.Client{}
- 构造请求单词和类型。注意!这里必须使用流,如strings.NewReader,纯字符串可能会太长或转义出错
- 构造http请求http.NewRequest
- 设置各种请求头req.Header.Set
- 发送请求resp, err := client.Do(req)
- 打开延时函数,等待执行完毕再关闭,不然漏数据defer resp.Body.Close()。响应response 有它的HTTP状态码,response.header和response.body
- 读取数据流bodyText, err := ioutil.ReadAll(resp.Body)
- 返回结果如下
json格式化
先定义结构体,再定义一个变量,初始化每个结构体成员,再调用JSON.marshaler来得到这个序列化之后的结果。序列化后是一个字节数组,需要把strings.newReader 改成bytes.newReader。再构造HTTP请求。
返回的json转go结构体
复制返回的结构体粘贴进这个网址
oktools.net/json2go 选择嵌套,把生成的结构体定义结果复制到go文件即可。
解析json为结构体
定义一个结构体对象var dictResponse DictResponse。使用JSON.Unmarshal解析到结构体对象,记得带&指针类型才能传输。然后想要获取输出的某个字段,使用xxx.xxx.xxx(结构体1.结构体2.字段名)嵌套进去读取字段即可。