这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
本文记录的是第一天上课时录播视频中遇到的不会的知识点,并不会一贯地按着ppt来罗列一些知识点,仅仅代表我个人的一些观点与看法,欢迎各位大佬指点问题。
1.关于Go的简介
1.1 什么是Go语言
1.2 ByteDance为什么选择了Golang
2.关于Go的语法
2.1 变量
在Go语言里面有两种声变量的方式
- 变量名 := value
2.2 有关条件以及循环语句
- Golang中没有while 在go语言中,while不是关键字,可以用for语句加break实现while循环
- 对于if-else 后面的条件不需要加括号,以及大括号{ }的第一个{需要与if 或者else 在同一行,否则会编译错误
- for这个关键字用的时候也是不需要加括号,其他类似c++ java
- for {} 这样可以表示无限循环,需要加break来退出循环
- switch 也不用加括号,可以不加任何条件,直接到对应的语句去判断条件
2.3 常用数据结构
- 数组,长度固定且在内存连续分配
- 切片,需要用make关键字来创建
- map与java,c++类似
- 用range来遍历数据时,需要两个值进行循环一个索引,一个值
2.4函数
要注意Golang里面函数传参是值传递,所以在多数情况下参数需要带&或者指针类型*
2.5结构体
- 下面的demo 理清所有用法
- 结构体中的方法有点类似java类中的方法
- 在实现结构体的方法时,有两种,一种是通过指针指向原来结构体的内存,这种可以改变结构体内的值,一种是直接用结构体名字,这种不能改变结构体内的值,实质是对原来结构体的拷贝
2.6错误处理
- 在Golang里面能很清晰地知道哪个函数返回了错误,并且能够用简单的if-else来判断错误
- 在写函数返回时,则需要返回两个值,一个是原函数结果+error 如果原来函数没有错误,正常返回,否则,返回error = nil 表示空
2.7字符串操作
2.8时间处理
2.9 处理JSON
3 实战
3.1猜数
随机数需要加seed,seed里参数可以用时间戳来,否则每次随机都是相同的数
3.2英语翻译
我在下面代码都加了注释 方便理解
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http" //http包 用来发送请求以及接受响应
"os"
)
type DictRequest struct { //自定义一个与json数据相对应的结构体 只有前两个字段有用
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"user_id"`
}
type DictResponse struct { //在解析response body时,用的一个代码生成网站,来生成的结构体 https://oktools.net/json2go
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{}
request := DictRequest{TransType: "zh2en", Source: word}
buf, err := json.Marshal(request) //将结构体进行json序列化 并且这边会返回error异常 需要进行判断 返回的值为一个byte数组
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("Connection", "keep-alive")
req.Header.Set("DNT", "1")
req.Header.Set("os-version", "")
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 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("device-id", "")
req.Header.Set("os-type", "web")
req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
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-CN,zh;q=0.9")
req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
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) //json反序列化为结构体
if err != nil {
log.Fatal(err)
}
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 { //如果输入的内容不是仅仅为一个单词 这里是2是因为系统会自带传一个参数 os.Args的第一个元素,os.Args, 是命令本身的名字
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`)
os.Exit(1)
}
word := os.Args[1]
query(word)
}
想说基本上注释都有了
3.3sock5代理服务器
好难,大部分内容没怎么看懂,水了........ 最后就运行了下老师给的源代码,发现要在cmd窗口下运行才可以,在powershell中会报错