青训营学习第一天

92 阅读3分钟

学习内容

今天学习了第一章节的Go语言原理与实践的第一和第二节课。主要学习了go语言的快速上手和三个实战案例。

go语言的优势

1.高性能、高并发

2.语法简单、学习曲线平缓

3.丰富的标准库

4.完善的工具链

5.静态链接

6.快速编译

7.跨平台

8.垃圾回收

具体内容

然后就是具体内容的学习,主要有go开发环境的安装,还有go语言基础语法的使用以及切片,map,指针,结构体的操作还有第三方库的使用。 实战项目主要有猜谜游戏(随机数的使用),在线词典(http,json格式化)和SOCKS5代理。

猜谜游戏

猜谜游戏主要使用了利用种子生成随机数和bufio读取标准输入输出以及字符串的相关操作。

import (
   "bufio"
   "fmt"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "time"
)

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNnmber := rand.Intn(maxNum)
   fmt.Println("请猜一个1-100以内的数字")

   //缓冲区读取标准输入
   reader := bufio.NewReader(os.Stdin)
   for {
      // 读取一行为止,如果出错,跳出本次循环,继续下次循环
      readString, err := reader.ReadString('\n')
      if err != nil {
         fmt.Println("an err occurred while", err)
         continue
      }
      //去除一行末尾的换行字符
      input := strings.TrimSuffix(readString,"\n")
      input = strings.TrimSuffix(input,"\r")
      // 将字符串转为整型
       guess, err := strconv.Atoi(input)
      if err != nil {
         fmt.Println("检验失败,请输入数字",err)
         continue
      }
      if guess > secretNnmber {
         fmt.Println("你猜的数比较大,再试一下")
      }else if  guess < secretNnmber{
         fmt.Println("你猜的数较小,再猜猜看")
      }else {
         fmt.Println("恭喜你,猜对了,奥里给!")
         break
      }
   }
}

在线词典

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 AutoGenerated struct {
   Rc int `json:"rc"`
   Wiki struct {
   } `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 []interface{} `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 main()  {
   if len(os.Args)<2 {
      log.Println("无效的单词")
      os.Exit(1)
   }
   word := os.Args[1]
   query(word)
}

func query(word string)  {
   client := http.Client{}
   request := DictRequest{
      TransType: "en2zh",
      Source: word,
   }
   // json格式化
   buf , err :=json.Marshal(request)
   if err != nil {
      log.Fatal(err)
   }
   //将json格式化的二进制转化为reader对象
   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("authority", "api.interpreter.caiyunai.com")
   req.Header.Set("accept", "application/json, text/plain, */*")
   req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
   req.Header.Set("app-name", "xy")
   req.Header.Set("content-type", "application/json;charset=UTF-8")
   req.Header.Set("device-id", "4f60cbfa6eba7f5ec451520982c56954")
   req.Header.Set("origin", "https://fanyi.caiyunapp.com")
   req.Header.Set("os-type", "web")
   req.Header.Set("os-version", "")
   req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
   req.Header.Set("sec-ch-ua", `"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"`)
   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", "cross-site")
   req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36")
   req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
   // 发送请求,获取响应
   rep, err := client.Do(req)
   defer rep.Body.Close()
   // 获取响应状态
   fmt.Println(rep.Status)
   // 读取响应体内容
   bodyText , err :=ioutil.ReadAll(rep.Body)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Printf("%s",bodyText)
   // 将响应体反json序列化为定义的结构体
   var dict AutoGenerated
   err = json.Unmarshal(bodyText,&dict)
   if err != nil {
      log.Fatal(err)
   }
   // 打印响应体内容
   fmt.Printf("%v",dict)
   // 打印响应体指定内容
   fmt.Println(dict.Dictionary.Type)
   // 遍历结构体内容并输出打印
   for _ , item := range dict.Dictionary.Explanations {
      fmt.Println(item)
   }

}

这里用到json格式化和反序列化,以及http请求与响应,还有几个比较好用的工具网站,可以解析url响应以及json格式化为结构体