Go语言入门 | 青训营笔记
2023年1月15日,今天学习了Go语言青训营的第一节课,开始讲了Go语言的基础语法,后面引入了三个demo项目带我们进入了Go语言的世界。这里先放上了课程资料的github:github.com/wangkechun/…
Demo1 guessing-game
v5 代码如下所示,一次次推导到这里
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.Trim(input, "\r\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
其实这里还可以用 fmt.Scanf 来简化操作,这里完成作业1:
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)
fmt.Println("Please input your guess")
guess := 0
for {
_, err := fmt.Scanf("%d\n", &guess)
if err != nil {
fmt.Printf("Invalid input: %s", err.Error())
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
}
}
}
Demo2 simpledict
作业2
一个在线网站可以把curl 转换成code curlconverter.com/
另外再推荐一个 utool插件(就是这个插件名字有些奇怪哦 但这个插件是支持很多语言的)
JSON 转 Go Struct oktools.net/
同理也有utool插件
同理 可以获得 DictRequest 请求对象
{"source_language":"detect","target_language":"zh","text":"a","home_language":"zh","category":"","glossary_list":[],"enable_user_glossary":false}
type DictRequest struct {
SourceLanguage string `json:"source_language"`
TargetLanguage string `json:"target_language"`
Text string `json:"text"`
HomeLanguage string `json:"home_language"`
Category string `json:"category"`
GlossaryList []interface{} `json:"glossary_list"`
EnableUserGlossary bool `json:"enable_user_glossary"`
}
func UnmarshalReq(data []byte) (DictRequest, error) {
var r DictRequest
err := json.Unmarshal(data, &r)
return r, err
}
func (r *DictRequest) Marshal() ([]byte, error) {
return json.Marshal(r)
}
同理 获得 DictResponse 对象
{"translation":"一个","detected_language":"en","probability":1,"base_resp":{"status_code":0,"status_message":""}}
func UnmarshalDictResponse(data []byte) (DictResponse, error) {
var r DictResponse
err := json.Unmarshal(data, &r)
return r, err
}
func (r *DictResponse) Marshal() ([]byte, error) {
return json.Marshal(r)
}
type DictResponse struct {
Translation string `json:"translation"`
DetectedLanguage string `json:"detected_language"`
Probability int64 `json:"probability"`
BaseResp BaseResp `json:"base_resp"`
}
type BaseResp struct {
StatusCode int64 `json:"status_code"`
StatusMessage string `json:"status_message"`
}
完整代码:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
type DictRequest struct {
SourceLanguage string `json:"source_language"`
TargetLanguage string `json:"target_language"`
Text string `json:"text"`
HomeLanguage string `json:"home_language"`
Category string `json:"category"`
GlossaryList []interface{} `json:"glossary_list"`
EnableUserGlossary bool `json:"enable_user_glossary"`
}
func UnmarshalReq(data []byte) (DictRequest, error) {
var r DictRequest
err := json.Unmarshal(data, &r)
return r, err
}
func (r *DictRequest) Marshal() ([]byte, error) {
return json.Marshal(r)
}
func UnmarshalDictResponse(data []byte) (DictResponse, error) {
var r DictResponse
err := json.Unmarshal(data, &r)
return r, err
}
func (r *DictResponse) Marshal() ([]byte, error) {
return json.Marshal(r)
}
type DictResponse struct {
Translation string `json:"translation"`
DetectedLanguage string `json:"detected_language"`
Probability int64 `json:"probability"`
BaseResp BaseResp `json:"base_resp"`
}
type BaseResp struct {
StatusCode int64 `json:"status_code"`
StatusMessage string `json:"status_message"`
}
func query(word string) {
client := &http.Client{}
reqStruct := DictRequest{
SourceLanguage: "detect",
TargetLanguage: "zh",
Text: word,
HomeLanguage: "zh",
GlossaryList: []interface{}{},
EnableUserGlossary: false,
}
marshal, _ := reqStruct.Marshal()
var data = bytes.NewBuffer(marshal)
req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/translate/v1/?msToken=&X-Bogus=DFSzswVLQDG-vG9HSZWYwl9WX7je&_signature=_02B4Z6wo00001x162EQAAIDDnXgiBgf9FFMdetzAAKSnQldxwVYN5WwQW3RoHpbCXLWYEnncYYvDoCe0I.PnQKsAKM8BMdHTsH9yz1VrcNEdBp5idWZHZFsyoUvhRxj8PdLv1M5sz.vvCHzq2b", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "translate.volcengine.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8")
req.Header.Set("cache-control", "no-cache")
req.Header.Set("content-type", "application/json")
req.Header.Set("cookie", "x-jupiter-uuid=16737843381976928; i18next=zh-CN; s_v_web_id=verify_lcxbzaqu_EIXSj29R_Fwad_4pwE_BbIW_Tj4kSNxf2v51; ttcid=750cf9b1f3994cfb92c902397fd3727559; tt_scid=wexoD3EFYJRkQWwMksnD50zJWkS9CMUGK3ARgxHifFlMqh3fRN555kGvVEMDOu6i0c66")
req.Header.Set("origin", "https://translate.volcengine.com")
req.Header.Set("pragma", "no-cache")
req.Header.Set("referer", "https://translate.volcengine.com/mobile?category=&home_language=zh&source_language=detect&target_language=zh&text=a")
req.Header.Set("sec-ch-ua", `"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
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/108.0.0.0 Safari/537.36")
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)
}
response, _ := UnmarshalDictResponse(bodyText)
println(response.Translation)
}
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)
}
由于 火山引擎可能做了一定的签名算法等措施,接口不是非常好盗取,像这里,只能翻译文本a不能翻译其他的,所以这里我翻取了火山引擎搜索API的文档,去申请了 api (这里自己就去看文档和 火山引擎的控制台吧 我就不过多赘述了)
作业三:
使用两个携程并发去进行翻译,然后优先返回最先做出回应的,这里就不赘述了
Demo3 proxy
主要是学了 Go语言怎么开发一个简单的 sock5 服务器,这里学习了一下sock5 协议 有机会可以实现一下完整的,这里在记录一下网上看到的 sock5 协议详解 www.ddhigh.com/2019/08/24/…