Go 语言基础 - 基础语法 | 青训营笔记

113 阅读4分钟

这是我参与「第五届青训营 」笔记创作活动的第1天

重点内容

  • 配置Go语言开发环境
  • Golang变量、常量声明
  • for循环
  • if条件判断
  • switch case
  • array数组
  • slice切片
  • map集合
  • range遍历
  • func函数
  • *取值 &取地址
  • struct结构体
  • 结构体方法
  • error库
  • strings库
  • fmt库
  • encoding/json库
  • time库
  • strconv库
  • os库

知识点介绍

  • Golang中有且只有for循环

    for{
        // code    
    }
    for i := 0; i < 5; i++{
        // code
    }
    for idx,item := range(切片、Map等等){
        // code
    }
    
  • switch case

    • 可以代替if else
    • 不需要break分割
    • 可以使用fallthrough执行多个
temp := 1
switch temp {
    case 1:
    fmt.Println("a")
    fallthrough
    // 当case 1 时会强制执行2 
    case 2:
    fmt.Println("b")
    case 3:
    fmt.Println("c")
}
// 结果
// a
// b
  • Golang中的map是一种无序的key/value对
  • range可以用来迭代数组(array)、切片(slice)、通道(channel)、集合(map)
  • Golang中使用返回值进行错误处理

实践

猜数字游戏

直接使用rand包中的Intn会生成伪随机数,每次启动程序的随机值一样。

我们可以使用Seed加时间戳实现真随机数。

输入输出的数据流可以使用标准库fmt优化。

翻译

主要学习如何使用代码生成工具

将json转换为Golang结构体:OKTools

使用curl命令生成函数:Curlconvert

结构体可以序列化为json字符串,json字符串通过tag标签可以反序列化为结构体。

Socket5代理

协议每部分的字节长度已知,可以通过顺序读取字节流获取信息。

使用context包中的WithCancel以及Done()控制程序结束实践。

课后总结

  • 学习了如何配置Golang开发环境
  • Golang基础语法
  • 了解了一些标准库的使用

作业

使用fmt优化guess_game

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")
​
    for {
        var guess int
        _, err := fmt.Scan(&guess)
        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
        }
    }
}

新增一种翻译引擎并使用并发加快翻译速度

仅记录新增代码

type HSDictReq struct {
    Source         string   `json:"source"`
    Words          []string `json:"words"`
    SourceLanguage string   `json:"source_language"`
    TargetLanguage string   `json:"target_language"`
}
​
type HSDictResponse struct {
    Details []struct {
        Detail string `json:"detail"`
        Extra  string `json:"extra"`
    } `json:"details"`
    BaseResp struct {
        StatusCode    int    `json:"status_code"`
        StatusMessage string `json:"status_message"`
    } `json:"base_resp"`
}
​
type Details struct {
    ErrorCode string `json:"errorCode"`
    RequestID string `json:"requestId"`
    Msg       string `json:"msg"`
    Result    []struct {
        Ec struct {
            ReturnPhrase []string `json:"returnPhrase"`
            Synonyms     []struct {
                Pos   string   `json:"pos"`
                Words []string `json:"words"`
                Trans string   `json:"trans"`
            } `json:"synonyms"`
            Etymology struct {
                ZhCHS []struct {
                    Description string `json:"description"`
                    Detail      string `json:"detail"`
                    Source      string `json:"source"`
                } `json:"zh-CHS"`
            } `json:"etymology"`
            SentenceSample []struct {
                Sentence     string `json:"sentence"`
                SentenceBold string `json:"sentenceBold"`
                Translation  string `json:"translation"`
            } `json:"sentenceSample"`
            WebDict string `json:"webDict"`
            Web     []struct {
                Phrase   string   `json:"phrase"`
                Meanings []string `json:"meanings"`
            } `json:"web"`
            MTerminalDict string `json:"mTerminalDict"`
            RelWord       struct {
                Word string `json:"word"`
                Stem string `json:"stem"`
                Rels []struct {
                    Rel struct {
                        Pos   string `json:"pos"`
                        Words []struct {
                            Word string `json:"word"`
                            Tran string `json:"tran"`
                        } `json:"words"`
                    } `json:"rel"`
                } `json:"rels"`
            } `json:"relWord"`
            Dict  string `json:"dict"`
            Basic struct {
                UsPhonetic string   `json:"usPhonetic"`
                UsSpeech   string   `json:"usSpeech"`
                Phonetic   string   `json:"phonetic"`
                UkSpeech   string   `json:"ukSpeech"`
                ExamType   []string `json:"examType"`
                Explains   []struct {
                    Pos   string `json:"pos"`
                    Trans string `json:"trans"`
                } `json:"explains"`
                UkPhonetic  string `json:"ukPhonetic"`
                WordFormats []struct {
                    Name  string `json:"name"`
                    Value string `json:"value"`
                } `json:"wordFormats"`
            } `json:"basic"`
            Phrases []struct {
                Phrase   string   `json:"phrase"`
                Meanings []string `json:"meanings"`
            } `json:"phrases"`
            Lang   string `json:"lang"`
            IsWord bool   `json:"isWord"`
        } `json:"ec"`
    } `json:"result"`
}
​
func queryHuoShan(word string) {
    client := &http.Client{}
    request := HSDictReq{"youdao", []string{word}, "en", "zh"}
    buf, err := json.Marshal(request)
    if err != nil {
        log.Fatal(err)
    }
    var data = bytes.NewReader(buf)
    req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/detail/v1/?msToken=&X-Bogus=DFSzswVOQDaZVvKbSZUbXVXAIQ2a&_signature=_02B4Z6wo00001B7O8LgAAIDBfcQw0g53GJAezvQAAGR2VpMXmfgdHgCXt4qUcV0ujZJIIzsgogve15Now0CEot3vCcFKdbgTYHY5zMjAHYMSyunGev.5Al2F7Sb4GBxWeMuvCLbKKZd3XAWzb8", 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")
    req.Header.Set("content-type", "application/json")
    req.Header.Set("cookie", "x-jupiter-uuid=16737647316086264; i18next=zh-CN; s_v_web_id=verify_lcx0b13u_175PBAV8_sac1_4b1O_BHDz_9GgIAlnHe93G; ttcid=37563e1a38cb48a2aacecc67d1a16b8a38; tt_scid=lFMZaHHB.938uRZh.2UF1GPIIKNDOMYL.Iyw9DgIHxi0192MJcOVZQMNVObFtnfv4b5a")
    req.Header.Set("origin", "https://translate.volcengine.com")
    req.Header.Set("referer", "https://translate.volcengine.com/?category=&home_language=zh&ref=toolsdar.com&source_language=detect&target_language=zh&text=good")
    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)
    }
    if resp.StatusCode != 200 {
        log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
    }
    var dictResponse HSDictResponse
    err = json.Unmarshal(bodyText, &dictResponse)
    if err != nil {
        log.Fatal(err)
    }
    var detail Details
    err = json.Unmarshal([]byte(dictResponse.Details[0].Detail), &detail)
    if err != nil {
        log.Fatal(err)
    }
    for _, item := range detail.Result {
        fmt.Println("火山翻译结果")
        fmt.Println(word, "Uk:[", item.Ec.Basic.UkPhonetic, "]Us:[", item.Ec.Basic.UsPhonetic, "]") // 音标
        for _, item2 := range item.Ec.Basic.Explains {
            fmt.Printf("%s:\n%s\n", item2.Pos, item2.Trans)
        } // 翻译
    }
    fmt.Println("-----------------------")
}

难点

火山翻译的返回值中的Detail是含有转义字符的字符串,无法直接使用生成工具生成代码。

将结果中的details字符串保存为字符串,并新增对应结构体再次使用json.Marshal反序列化,成功得到结果。