简介:
这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记。
本篇文章是基于青训营5月7日的课程所展开的。该课程给我们分享了三个实战项目,分别是:猜谜游戏、命令行词典、SOCKS5代理;对于该三个实战项目,我后面会对前两个项目进行介绍,第三个有点难度,自己还得再深入理解一下,其次,课程结尾留有三个实战作业,我也完成了并进行记录于本文。
前提知识
在阅读本文之前,读者需要熟悉Go语言的基本语法,并能够进行相应的编码即可。
前言
在开展本文之前,我先给大家贴出本次课程的作业,以方便大家带着思考去阅读本文。
1. 猜谜游戏
该项目是基于一个简单的猜数字游戏,系统随机一个整数,玩家输入数字进行猜数环节,同时,系统也会给玩家进行相应的提示,比如玩家输入的数字比系统随机出的整数要大,就提示输入的数字过大,然后玩家根据系统提示进行相应的调整。
1.1 代码解析
由于系统要随机一个整数,因此我们得在程序里写一个生成随机数的方法,其GO语言的实现是:
maxNum := 100
rand.Seed(time.Now().UnixNano()) // 设置时间种子,每次生成随机数保证大概率不相同
secretNumber := rand.Intn(maxNum)
构造一个输入流,用于接收用户的输入情况,同时定义相关逻辑(用户输入的数比随机数要大,提示相应的信息)
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
}
}
1.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")
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
}
}
}
由于作业要求,把输入流转为fmt.Scanf。下面就是由我完成代码的详细情况:
1.3 猜谜游戏作业
package main
import (
"fmt"
"math/rand"
"time"
)
func randNum(maxNum int) int{
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
return secretNumber
}
func doWork(guess int,secretNumber int) bool{
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!")
return true
}
return false
}
func main() {
secretNumber := randNum(100)
fmt.Println("Please input your guess")
//reader := bufio.NewReader(os.Stdin)
for {
var guess int
_,err := fmt.Scanf("%d",&guess)
if err != nil{
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
flag := doWork(guess,secretNumber)
if flag{
break
}
}
}
换成fmt.Scanf后代码整洁好多了,当然还有很多相应的Scanf知识点需要自己学习与提高。
2. 命令行词典
这个项目代码有点多,而且好多代码是相应的工具生成的,我先贴一下课程里完整的代码,然后在此基础上完成一个程序对另一种翻译引擎的支持。
2.1 完整代码
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("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)
}
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)
}
2.2 命令行词典作业
2.2.1 百度翻译词典
首先,我们进入百度翻译界面,然后打开开发者模式,点击下图的页面
右键,然后找到Copy选项,然后再选择Copy as cURL(bash)选项,拷贝即可,然后再打开网站
拷贝生成的代码,复制到编辑器。然后再打开百度翻译界面,打开开发者模式
复制里面的内容,然后再打开网站,将JSON转Golang Struct
!
复制代码,粘贴到编译器上,然后根据其JSON形式转换为Golang Struct,输出控制台即可,下面我给出自己的完整代码:
package main
import (
"bufio"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
type Request struct{
Query string `json:"query"`
}
type Response struct {
Errno int `json:"errno"`
Data []struct {
K string `json:"k"`
V string `json:"v"`
} `json:"data"`
}
func query(word string){
client := &http.Client{}
request := Request{Query: word}
var data = strings.NewReader("kw="+request.Query)
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
req.Header.Set("Accept-Language", "en,zh-CN;q=0.9,zh;q=0.8")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
req.Header.Set("Cookie", "BIDUPSID=66573F2C764AC16ED6A94E4B7DECDEE9; PSTM=1616301299; __yjs_duid=1_6338bae02f4f58f8e78fd24ba12a41cc1618904684298; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_WISE_SIDS=110085_127969_131861_176399_177371_178384_178612_179349_179379_179425_180276_181481_181588_182252_182530_183328_184042_184320_184361_184560_184793_184891_184894_185029_185241_185268_185305_185517_185638_185749_185872_185879_185890_186159_186317_186411_186596_186662_186716_186840_187022_187061_187186_187282_187292_187391_187417_187433_187449_187532_187567_187669_187725_187726_187816_187928_187958_188060_188414_188425_188468_188614_188733_188749_188805_188832_188846_188870_188898_189071_189268_189295_189419; APPGUIDE_10_0_2=1; BDUSS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BDUSS_BFESS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BAIDUID=7B46454C3E6C78A9ADF03FC72E57A1A2:SL=0:NR=10:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=0405a58k0la18k81td1h7ai4k0q; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=2; BCLID=10319960442745530237; BDSFRCVID=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; BCLID_BFESS=10319960442745530237; BDSFRCVID_BFESS=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1650872219,1651250467,1651906887; BAIDUID_BFESS=9926C39CD39BF9C785AC1260B76D10B6:FG=1; H_PS_PSSID=36182_36309_31660_36004_36166_34584_35978_35802_36233_26350_36314_36061; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1651912910; ab_sr=1.0.1_YmYyNGU2YzMyNzIwMmRkMmM2Y2E2M2Y3ZGYzODNjMTNmMTE0ODAxYjFkMDM1M2VkNTI3MzkwMGIzZDNjZDlhOTAwNmNmYmE4MjAxOTA4MDRjZTJkMWFhZDNhNmE0ZjlmNjUxMTdhN2Y2YTA1MjUwM2RlYTQyNjliYmFhNjQzN2ZjMTliNWQ2MzE2Nzc2ZWQwMzNiMjE0ZjZlMjIzNGFmNzE5MWE2MzE1ZDgyYzkwYmU5NTJjYWI5MjEwOWU5N2Y4")
req.Header.Set("Origin", "https://fanyi.baidu.com")
req.Header.Set("Referer", "https://fanyi.baidu.com/?aldtype=16047")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Site", "same-origin")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
req.Header.Set("X-Requested-With", "XMLHttpRequest")
req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
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 response Response
err = json.Unmarshal(bodyText,&response)
if err!=nil{
log.Fatal(err)
}
for _,item := range response.Data{
fmt.Println(item.V)
}
}
func main() {
for{
fmt.Println("请输入您要翻译的英文单词:(-1代表退出)")
reader := bufio.NewReader(os.Stdin)
res,_,err := reader.ReadLine()
if err != nil{
fmt.Println("reader.ReadLine() error:", err)
}
if string(res) == "-1"{
fmt.Println("程序已退出")
break
}
fmt.Println("翻译结果如下:")
query(string(res))
}
}
运行结果如下:
3. 并发请求两个翻译引擎提高响应速度
上述,我们已经有两个程序分别是原有的(针对彩云科技翻译),现写的(百度翻译),我们在Go的main函数下可以启动两个线程,分别执行翻译,然后先得出结果的直接返回即可,这样可以提高响应速度,由于个人在Go并发方面没有深入学习,我就加了一个全局变量Num = 1,如果一个线程执行完毕,num减一,另一个线程如果发现num<1时,直接退出。这种方法局限性很高,不建议使用,待个人深入学习后,会加以改造。下面会我的代码:
package main
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
var num = 1
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 query1(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("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)
}
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)
}
num--
}
type Request2 struct{
Query string `json:"query"`
}
type Response2 struct {
Errno int `json:"errno"`
Data []struct {
K string `json:"k"`
V string `json:"v"`
} `json:"data"`
}
func query2(word string){
if num == 0{
return
}
client := &http.Client{}
request := Request2{Query: word}
var data = strings.NewReader("kw="+request.Query)
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
req.Header.Set("Accept-Language", "en,zh-CN;q=0.9,zh;q=0.8")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
req.Header.Set("Cookie", "BIDUPSID=66573F2C764AC16ED6A94E4B7DECDEE9; PSTM=1616301299; __yjs_duid=1_6338bae02f4f58f8e78fd24ba12a41cc1618904684298; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_WISE_SIDS=110085_127969_131861_176399_177371_178384_178612_179349_179379_179425_180276_181481_181588_182252_182530_183328_184042_184320_184361_184560_184793_184891_184894_185029_185241_185268_185305_185517_185638_185749_185872_185879_185890_186159_186317_186411_186596_186662_186716_186840_187022_187061_187186_187282_187292_187391_187417_187433_187449_187532_187567_187669_187725_187726_187816_187928_187958_188060_188414_188425_188468_188614_188733_188749_188805_188832_188846_188870_188898_189071_189268_189295_189419; APPGUIDE_10_0_2=1; BDUSS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BDUSS_BFESS=NLTmpGNEYtTnBRaDNMdDdONkRseHJ4OXhhNXZCWkVJajhQbFBHd1EwdXQ1RTlpRVFBQUFBJCQAAAAAAAAAAAEAAAB88w3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1XKGKtVyhiV2; BAIDUID=7B46454C3E6C78A9ADF03FC72E57A1A2:SL=0:NR=10:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=0405a58k0la18k81td1h7ai4k0q; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=2; BCLID=10319960442745530237; BDSFRCVID=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; BCLID_BFESS=10319960442745530237; BDSFRCVID_BFESS=7ctOJexroG0xL9RDJo-hbkGN72KK0gOTDYLEG9rAuI0ShsAVgICqEG0Pt8Yk1EIbTT0MogKKLgOTHUCF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tJk8oDPbJK03fP36q4jqMJtJ5eT22jPfK5n9aJ5y-J7nh-nseq5Uy4RDMM5W0MCfte3ion3vQpbZ8h5jeJ5N5fcQ0U7e3l5MWm7DKl0MLP-WoJklQfrD3h3QXfnMBMnr52OnaU5n3fAKftnOM46JehL3346-35543bRTLnLy5KJYMDcnK4-Xj6OQDNOP; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1650872219,1651250467,1651906887; BAIDUID_BFESS=9926C39CD39BF9C785AC1260B76D10B6:FG=1; H_PS_PSSID=36182_36309_31660_36004_36166_34584_35978_35802_36233_26350_36314_36061; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1651912910; ab_sr=1.0.1_YmYyNGU2YzMyNzIwMmRkMmM2Y2E2M2Y3ZGYzODNjMTNmMTE0ODAxYjFkMDM1M2VkNTI3MzkwMGIzZDNjZDlhOTAwNmNmYmE4MjAxOTA4MDRjZTJkMWFhZDNhNmE0ZjlmNjUxMTdhN2Y2YTA1MjUwM2RlYTQyNjliYmFhNjQzN2ZjMTliNWQ2MzE2Nzc2ZWQwMzNiMjE0ZjZlMjIzNGFmNzE5MWE2MzE1ZDgyYzkwYmU5NTJjYWI5MjEwOWU5N2Y4")
req.Header.Set("Origin", "https://fanyi.baidu.com")
req.Header.Set("Referer", "https://fanyi.baidu.com/?aldtype=16047")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Site", "same-origin")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
req.Header.Set("X-Requested-With", "XMLHttpRequest")
req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
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 response Response2
err = json.Unmarshal(bodyText,&response)
if err!=nil{
log.Fatal(err)
}
if num == 0{
return
}
for _,item := range response.Data{
fmt.Println(item.V)
}
num--
}
func main() {
for{
num = 1
reader := bufio.NewReader(os.Stdin)
res,_,err := reader.ReadLine()
if nil!=err{
fmt.Println("reader.ReadLine() error:", err)
}
go query2(string(res))
go query1(string(res))
}
}
4.总结
本次课程让我熟悉了Go语言的语法,以及简单的项目实战,同时在这两个项目实战中,深刻体会到了Go语言的简洁与方便。