这是我参与「第五届青训营 」伴学笔记创作活动的第 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 抓包
fn+f12查看源代码-->输入单词点翻译-->找到dict(Headers.Request Method=Post的文件)-->找到Payload与Preview
2.2 代码生成
divt-->COPY-->COPY as cURL(bash) 复制粘贴到网站中的curl command:
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
将此时的DicResponse结构体添加到上面的代码中,删除最后一行输出,加上以下代码:
2.5 完善代码
1、import里添加"os"
2、将main()函数修改成query(word string)函数,Source原本的"good"改成变量word
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)
}
运行结果:
三、个人总结
个人感觉蛮有难度的,敲代码的时候也经常犯错555~~