Go 语言基础(课后作业) | 青训营笔记

142 阅读3分钟

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

一、本堂课重点内容:

  1. 基础语法
  2. 标准库

二、详细知识点介绍:

  • 指定变量类型,如果没有初始化,则变量默认为零值。
  • 根据值自行判定变量类型。
  • 如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误。
  • Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。

和 C 语言的 for 一样: for init; condition; post { }

和 C 的 while 一样: for condition { }

和 C 的 for(;;) 一样: for { }

三、实践练习例子:

  1. 项目一:猜谜游戏
  2. 项目二:命令行词典
  3. 项目三:SOCKS5 代理

四、课后练习总结:

1、修改第一个例子猜谜游戏里面的最终代码,使用fmt.Scanf来简化代码实现

package main

//引入包依赖
import (
   "fmt"
   "math/rand"
   "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")
   var input string
   //reader := bufio.NewReader(os.Stdin)
   for {
      //input, err := reader.ReadString('\n')        //原代码部分用bufio进行读取键盘输入
      _, err := fmt.Scanf("%s\n", &input)//获取键盘输入
      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
      }
   }
}

2、修改第二个例子命令行词典里面的最终代码,增加另一种翻译引擎的支持

3、在第二步的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度

package main

import (
   "bytes"
   "encoding/json"
   "fmt"
   "io/ioutil"
   "log"
   "net/http"
   "os"
)

//火山翻译请求体
type DictRequest2 struct {
   Source         string   `json:"source"`//翻译来源
   Words          []string `json:"words"`//翻译的文字
   SourceLanguage string   `json:"source_language"`//原语言
   TargetLanguage string   `json:"target_language"`//目标语言
}

//火山翻译响应体
type DictResponse2 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"`
}

//火山翻译查询函数
func query2(word string) {
   client := &http.Client{}
   //var data = strings.NewReader(`{"source":"youdao","words":["good"],"source_language":"en","target_language":"zh"}`)

   request := DictRequest2{Source: "youdao", Words: []string{word}, SourceLanguage: "en", TargetLanguage: "zh"}//构造请求体对象
   buf, err := json.Marshal(request)//序列化为字节数组
   if err != nil {
      log.Fatal(err)
   }
   var data = bytes.NewReader(buf)//字节数组转换为io流
   req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/detail/v1/?msToken=&X-Bogus=DFSzswVOQDaZVUEbSZ4/h34ELVcH&_signature=_02B4Z6wo00001HP3BOgAAIDDwwboIMts05Bz9wBAAH9AfgkPz2D5seB76Jp-URtvkiiOjzq7Ka75D1QEKvz.E1gsqOJ-IVKDaneoAeNThalCt1k3ZFx9wVWB65bXuu-tnbaZk-j5rMgpEhXl1a", data)//构造请求
   if err != nil {
      log.Fatal(err)
   }
   //设置相关请求头参数
   req.Header.Set("authority", "translate.volcengine.com")
   req.Header.Set("pragma", "no-cache")
   req.Header.Set("cache-control", "no-cache")
   req.Header.Set("accept", "application/json, text/plain, */*")
   req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")
   req.Header.Set("content-type", "application/json")
   req.Header.Set("origin", "https://translate.volcengine.com")
   req.Header.Set("sec-fetch-site", "same-origin")
   req.Header.Set("sec-fetch-mode", "cors")
   req.Header.Set("sec-fetch-dest", "empty")
   req.Header.Set("referer", "https://translate.volcengine.com/mobile?category=&home_language=zh&source_language=detect&target_language=zh&text=good")
   req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
   req.Header.Set("cookie", "x-jupiter-uuid=16738739264083148; i18next=zh-CN; s_v_web_id=verify_lcytbfv1_rUqOT0lu_jsul_4950_AlHl_TcwtMThccviN; ttcid=d9808dbca4c44fa58e865a5a001e796420; tt_scid=c-zlvY6TcLEwbxg5vRL-tdrAJ1TuH3M19n9OzXPzGSQyPuRlysRzkcOU7CqUWdpk2c20")
   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)
   }

   var dictResponse DictResponse2
   err = json.Unmarshal(bodyText, &dictResponse)//由json反序列化为响应结构体
   if err != nil {
      log.Fatal(err)
   }
   for _, item := range dictResponse.Details {
      fmt.Printf("%v\n", item.Extra)
   }

}

func main() {
   if len(os.Args) != 2 {
      fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
      `)
      os.Exit(1)
   }
   word := os.Args[1]
   go query1(word)    //并行查询彩云小译
   query2(word)       //查询火山翻译
}