这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
1 课程分布
分为简介、入门、实战,笔记主要记录入门与实战部分,方便回过头来查找比较重要的方法。
1、1 Go语言入门
go的开发环境除了常用的goland编辑器之外还有云开发。
关于switch的用法,go里面也有default,但无需添加break语句。
重点:数组与切片的区别:数组的长度是固定的,更多的是使用切片,可以使用append方法来扩容,这是一个比较重要的区别。
重点:range的用法,range中会有两个元素,第一个是索引,第二个是所需要循环的列表中的单个对象
例如本次作业中需要循环打印结果:
for _,word := range res.Words {
fmt.Println(word.Text)
for _,posList := range word.PosList {
for _,explanation := range posList.Explanations {
fmt.Println("翻译:",explanation.Text)
for i,example := range explanation.Examples {
for _,sentence:= range example.Sentences {
fmt.Println("例子",i+1,":",sentence.Text,"翻译:",sentence.TransText)
}
}
}
}
}
go也拥有指针,与C与C++有所区别,支持的操作有限。当不使用指针时,去改变函数变量会改变失败,使用指针才能对变量进行修改,并且调用的时候需要加上&。
字符串常用的一些操作:
1、len()用来统计一个字符串的长度
2、strconv.Atoi()将一个字符串转化为一个整数
3、strconv.ItoA() 将一个整数转化为一个字符串
4、strconv.FormatInt(i int,base b) 将十进制转化为其他进制(2到32进制)
5、strings.Contains(BigStr string,littleStr string)
6、strings.Count(s, str string)
7、strings.ToLower(s)、stings.ToUpper(s) 将字符串进行大小写的变化
8、stringArr string[] = strings.Split(s,str) 将一个字符串按照指的的分隔符分割为一个字符串数组
1、2 实战
作业1、猜谜游戏
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
//fmt.Println("The secretNumber is ",secretNumber)
fmt.Println("请输入你猜的数据")
for {
var guess int
_, err := fmt.Scanf("%d", &guess)
if err != nil {
fmt.Println("invalid input please try again",err)
return
}
if guess > secretNumber {
fmt.Println("your guess is bigger,please try again")
}else if guess < secretNumber {
fmt.Println("your guess is smaller,please try again")
}else {
fmt.Println("your guess is correct")
break
}
}
}
fmt的scanf函数即可获取用户的输入,与C语言类似,并且使用rand的时候要为rand用时间戳来初始化随机数种子,并且通过if、else来判断用户的输入,在外层添加一层循环,用户输入正确后即结束循环。
运行结果:
作业2 字典
先记录几个好用的网站
https://oktools.net/json2go
可以将json格式的数据转换为go的结构体代码。
https://curlconverter.com/#go
可以将curl命令转为go的代码,包括设置请求头,发送请求等。
在这次作业我使用的是火山翻译。
translate方法如下,main函数调用与示例代码一致:
func translate(word string,wg *sync.WaitGroup) {
defer wg.Done()
client := &http.Client{}
request := DataRequestPayload{
Text: word,
Language: "en",
}
buffer, err := json.Marshal(request)
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buffer)
req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/match/v1/?msToken=&X-Bogus=DFSzswVYQDcCwfLhSWy8he9WX7je&_signature=_02B4Z6wo000016wY5cAAAIDDLBofgZYfqMusGOFAAImInJGNxMHkObRmOW27znoFrRp59Pr3oiQ45nB2oXE-eMa0Dz-VAizNyTYLGmWBb-l98uMszTZjT2vuTt8edtD0.ojCwge-BTnYlBte79", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "translate.volcengine.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8")
req.Header.Set("content-type", "application/json")
req.Header.Set("cookie", "x-jupiter-uuid=16521128243516392; s_v_web_id=verify_fce0853ccefd86e3be0a95977f655732; _tea_utm_cache_2018=undefined; ttcid=2a5f43a2c891402baf7f285e9ec5548e18; tt_scid=4rbYd03MlL7IfS8WBfvHzyK7Kdoz-bwGMjexgDHamN4yeuBv4wLnf.NTw3eAuq5d8b09; i18next=translate")
req.Header.Set("origin", "https://translate.volcengine.com")
req.Header.Set("referer", "https://translate.volcengine.com/translate?category=&home_language=zh&source_language=detect&target_language=zh&text=hello")
req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"`)
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", "same-origin")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
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 res ResultResponse
err = json.Unmarshal(bodyText, &res)
if err != nil {
log.Fatal(err)
}
for _,word := range res.Words {
fmt.Println(word.Text)
for _,posList := range word.PosList {
for _,explanation := range posList.Explanations {
fmt.Println("翻译:",explanation.Text)
for i4,example := range explanation.Examples {
for _,sentence:= range example.Sentences {
fmt.Println("例子",i4+1,":",sentence.Text,"翻译:",sentence.TransText)
}
}
}
}
}
}
结构体就不一一展示了,复制浏览器的response去上面那个网站转换为结构体即可。
运行结果:
作业3 并行请求
通过waitgroup即可实现
done方法可以使add中添加的计数器减一,wait方法等计数器置0即可往下进行。
main方法如下:
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD example: simpleDict hello
`)
os.Exit(1)
}
wg := sync.WaitGroup{}
wg.Add(2)
word := os.Args[1]
query(word,&wg)
translate(word,&wg)
}
query使用的是示例代码中的,只需添加参数并且defer wg.Done()即可。
运行结果: