这是我参与「第五届青训营 」伴学笔记创作活动的第 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),其次它的并发支持也很好。
- 但是,本次课程还是需要大量阅读基础知识,因为课程时长限制,能看出老师想给我们灌输很多知识,但是奈何时间限制,很多东西都是浅尝辄止,如果真的要继续深造或者做一个项目,对于基础用法还是需要牢牢掌握。