Go语言入门 | 青训营笔记

423 阅读3分钟

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
        }
    }
}

image-20230115200454555.png

Demo2 simpledict

作业2

一个在线网站可以把curl 转换成code curlconverter.com/

image-20230115200949510.png 另外再推荐一个 utool插件(就是这个插件名字有些奇怪哦 但这个插件是支持很多语言的)

image-20230115201201643.png

JSON 转 Go Struct oktools.net/

同理也有utool插件

image-20230115201324955.png

image-20230115201056820.png 同理 可以获得 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)
}
​

image-20230115204420028.png

由于 火山引擎可能做了一定的签名算法等措施,接口不是非常好盗取,像这里,只能翻译文本a不能翻译其他的,所以这里我翻取了火山引擎搜索API的文档,去申请了 api (这里自己就去看文档和 火山引擎的控制台吧 我就不过多赘述了)

image-20230115205901286.png

作业三:

使用两个携程并发去进行翻译,然后优先返回最先做出回应的,这里就不赘述了

Demo3 proxy

主要是学了 Go语言怎么开发一个简单的 sock5 服务器,这里学习了一下sock5 协议 有机会可以实现一下完整的,这里在记录一下网上看到的 sock5 协议详解 www.ddhigh.com/2019/08/24/…