Golang快速上手|青训营笔记

130 阅读3分钟

G这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

以下是几个内容模块:

  1. Go基础 自己看比较快,讲解的一般,感觉也就还行的样子

  2. 遇到没有遇到过得讲解的内容

在之前没有遇到过json、time、string的转换、以及os相关的内容

  1. Go实战

主要涉及到三个游戏

  1. 猜谜游戏 这个代码主要是为了学习,如何利用输入输出流,进行go的读入和写入

知识点1: 利用rand()生成种子,从而保证保持rand生成的数值不一样

知识点2: 利用流来进行输入输出

  1. 查字典 这个主要是为了学习json和struct之间的转换,以及http请求如何发送和回收

有一个注意带,在于statusCode的状态,需要校验

  1. sockets5代理
  1. 猜谜游戏
package main
​
import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
    "time"
)
​
// 玩家输入一个数进行猜测,数的范围是1-100
func main() {
    // 如果这样写的话,那么随机数就一直都是81,不会改变,因为种子固定
    //num := rand.Intn(100)// 为了每次运行都一样,所以需要不同的种子
    // 常用写法,利用时间戳来生成不一样的种子
    rand.Seed(time.Now().UnixNano())
    num := rand.Intn(100)
    for {
        fmt.Println("please write the number")
        // 读入输入流
        reader := bufio.NewReader(os.Stdin)
        // 读到一行截止,读的内容包含\n呀
        input, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("an error occured", err)
            return
        }
​
        // 去掉换行符
        input = strings.TrimSuffix(input, "\n")
        // 读入数字
        number, err := strconv.Atoi(input)
        
        if err != nil {
            fmt.Println("an error occur while reading input.Please try agagin", err)
        }
        // 当然也可以用fmt.Scanf(&num)
        fmt.Println("you guess is", num)
        if number == num {
            fmt.Println("you guess is write.")
            break
        } else if number > num {
            fmt.Println("you guess is bigger than the secret number.Please try again.")
        } else {
            fmt.Println("you guess is smaller than the secret number.Please try again.")
        }
    }
}
​
  1. 字典的转换

json的处理+http请求

package main
​
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
)
​
// 查询字典
// 发送http请求,并且获取(利用curlconvert)
// 利用struct->json->http->json->struct json的序列化和反序列化
// json反序列化的结构体可以用oktools.net/json2go 实际上百度都可以找到 不一定非要这个
// 然后利用结构体进行输出
func main() {
    // 动态读入参数
    if len(os.Args) != 2 {
        fmt.Fprint(os.Stderr, `error input`)
        os.Exit(1)
    }
    query(os.Args[1])
}
​
type DictRequest struct {
    Transtype string `json:"trans_type"`
    Source    string `json:"source""`
}
​
// json to go struct
type DictBody struct {
    Rc   int `json:"rc"`
    Wiki struct {
        KnownInLaguages int `json:"known_in_laguages"`
        Description     struct {
            Source string      `json:"source"`
            Target interface{} `json:"target"`
        } `json:"description"`
        ID   string `json:"id"`
        Item struct {
            Source string `json:"source"`
            Target string `json:"target"`
        } `json:"item"`
        ImageURL  string `json:"image_url"`
        IsSubject string `json:"is_subject"`
        Sitelink  string `json:"sitelink"`
    } `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      []string      `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 query(word string) {
    // 实现struct ->json
    var dictRequest = DictRequest{Transtype: "en2zh", Source: word}
    buf, err := json.Marshal(dictRequest)
    if err != nil {
        log.Fatal(err)
    }
    data := bytes.NewReader(buf)
​
    // http 请求的代码
    client := &http.Client{}
    //var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
    req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Set("Accept", "application/json, text/plain, */*")
    req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
    req.Header.Set("Connection", "keep-alive")
    req.Header.Set("Content-Type", "application/json;charset=UTF-8")
    req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
    req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
    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/100.0.4896.127 Safari/537.36")
    req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
    req.Header.Set("app-name", "xy")
    req.Header.Set("os-type", "web")
    req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"`)
    req.Header.Set("sec-ch-ua-mobile", "?0")
    req.Header.Set("sec-ch-ua-platform", `"Windows"`)
​
    // 获取请求
    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 status", resp.StatusCode, "body", string(bodyText))
    }
​
    var dictBody DictBody
    err = json.Unmarshal(bodyText, &dictBody)
    if err != nil {
        log.Fatal(err)
    }
​
    for _, item := range dictBody.Dictionary.Explanations {
        fmt.Println(item)
    }
}
​
  1. socks5代理

内网配置防火墙,防火墙非常严格,导致访问外部资源非常严格。