第五届青训营后端第一天学习笔记| 青训营笔记

65 阅读4分钟

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

一、本堂课重点内容:

  • 开发环境
  • 基础语法
  • 标准库

第一堂课非常极速的介绍Go的基本语法,如果有某一项语言的同学对于这堂课接受度还是比较高(特别是Python的同学),主要讲的是一个Golang程序如何跑起来。

二、详细知识点介绍:

这里就不进行赘述,因为课程时间限制,课上虽然没有对于基础知识进行手把手讲解,但是老师推荐的几个学习资料我觉得挺好的,我放在下边了。

三、实践练习例子:

老师用了三个实践案例进行基础用法的讲解,分别是:

- 猜谜游戏

下列代码为第一个实战案例,主要是为了告诉我们一个Go程序是怎么正常运作的,首先是包名、引入库(可选)、函数(如果要运行必须要有一个main函数)、其他(结构体、包级别变量)。

然后区别于其他语言的是,go中math.rand如果要真正引用一个随机数,需要设置随机种子,不然会一直返回81。 go的输入是用bufio开启的输入流,然后再进行读取。 然后就没啥要注意的了,感觉都大体一致相同。

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 secrect 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)
			return
			continue
		}

		input = strings.TrimSuffix(input, "\r\n")
		guess, err := strconv.Atoi(input)

		if err != nil {
			fmt.Println("Invalid input. Please enter an interger value")
			return
			continue
		}
		fmt.Println("Your guess is", guess)
		if guess == secretNumber {
			fmt.Println("Correct!")
			break
		} else if guess > secretNumber {
			fmt.Println("Your guess is bigger")
		} else {
			fmt.Println("Your guess is smaller")
		}
	}

}

- 命令行字典

这个实战案例主要是进行一个网页的请求以及json格式的序列化和反序列。 代码如下:

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 DictResponse 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) {
	client := &http.Client{}
	//var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
	request := DictRequest{TransType: "en2zh", Source: word}
	buf, err := json.Marshal(request)
	if err != nil {
		log.Fatal(err)
	}
	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("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"`)
	req.Header.Set("sec-ch-ua-mobile", "?0")
	req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36")
	req.Header.Set("app-name", "xy")
	req.Header.Set("content-type", "application/json;charset=UTF-8")
	req.Header.Set("accept", "application/json, text/plain, */*")
	req.Header.Set("os-type", "web")
	req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
	req.Header.Set("sec-ch-ua-platform", `"Windows"`)
	req.Header.Set("origin", "https://fanyi.caiyunapp.com")
	req.Header.Set("sec-fetch-site", "cross-site")
	req.Header.Set("sec-fetch-mode", "cors")
	req.Header.Set("sec-fetch-dest", "empty")
	req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
	req.Header.Set("accept-language", "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7")
	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 DictResponse
	err = json.Unmarshal(bodyText, &dictResponse)
	if err != nil {
		log.Fatal(err)
	}
	//fmt.Printf("%#v\n", dictResponse)
	fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
	for _, item := range dictResponse.Dictionary.Explanations {
		fmt.Println(item)
	}
}

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

这个案例从单一程序,拆分成了两个程序,main函数通过调用query函数进行翻译,学习到的点分别为结构体、json格式序列化以及反序列,同时go中的http请求也非常的方便,其他也没什么了,因为课上也是蜻蜓点水的过了一下。

- proxy

这个我就不讲解了,因为感觉这个实战案例其实不太适合基础这个用法,这是关于Proxy代理的程序代码,不过我从此也学到了代理相关知识,客户端通过代理对于服务器进行访问,区别于只是cs的模型,通过代理多增加一道流程。

四、课后个人总结:

  • 总结,Go语言相较于我之前用过的语言,它天然对于微服务支持力度更大,同时因为它诞生较晚,对于开发语言更加友好(也可能是因为我之前对于Python比较熟悉,难怪字节从Py转go),其次它的并发支持也很好。
  • 但是,本次课程还是需要大量阅读基础知识,因为课程时长限制,能看出老师想给我们灌输很多知识,但是奈何时间限制,很多东西都是浅尝辄止,如果真的要继续深造或者做一个项目,对于基础用法还是需要牢牢掌握。

五、引用参考:

  1. juejin.cn/post/718822…
  2. hi-hi.cn/