学习内容
今天学习了第一章节的Go语言原理与实践的第一和第二节课。主要学习了go语言的快速上手和三个实战案例。
go语言的优势
1.高性能、高并发
2.语法简单、学习曲线平缓
3.丰富的标准库
4.完善的工具链
5.静态链接
6.快速编译
7.跨平台
8.垃圾回收
具体内容
然后就是具体内容的学习,主要有go开发环境的安装,还有go语言基础语法的使用以及切片,map,指针,结构体的操作还有第三方库的使用。 实战项目主要有猜谜游戏(随机数的使用),在线词典(http,json格式化)和SOCKS5代理。
猜谜游戏
猜谜游戏主要使用了利用种子生成随机数和bufio读取标准输入输出以及字符串的相关操作。
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNnmber := rand.Intn(maxNum)
fmt.Println("请猜一个1-100以内的数字")
//缓冲区读取标准输入
reader := bufio.NewReader(os.Stdin)
for {
// 读取一行为止,如果出错,跳出本次循环,继续下次循环
readString, err := reader.ReadString('\n')
if err != nil {
fmt.Println("an err occurred while", err)
continue
}
//去除一行末尾的换行字符
input := strings.TrimSuffix(readString,"\n")
input = strings.TrimSuffix(input,"\r")
// 将字符串转为整型
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("检验失败,请输入数字",err)
continue
}
if guess > secretNnmber {
fmt.Println("你猜的数比较大,再试一下")
}else if guess < secretNnmber{
fmt.Println("你猜的数较小,再猜猜看")
}else {
fmt.Println("恭喜你,猜对了,奥里给!")
break
}
}
}
在线词典
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 AutoGenerated struct {
Rc int `json:"rc"`
Wiki struct {
} `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 []interface{} `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 main() {
if len(os.Args)<2 {
log.Println("无效的单词")
os.Exit(1)
}
word := os.Args[1]
query(word)
}
func query(word string) {
client := http.Client{}
request := DictRequest{
TransType: "en2zh",
Source: word,
}
// json格式化
buf , err :=json.Marshal(request)
if err != nil {
log.Fatal(err)
}
//将json格式化的二进制转化为reader对象
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("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
req.Header.Set("app-name", "xy")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "4f60cbfa6eba7f5ec451520982c56954")
req.Header.Set("origin", "https://fanyi.caiyunapp.com")
req.Header.Set("os-type", "web")
req.Header.Set("os-version", "")
req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
req.Header.Set("sec-ch-ua", `"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"`)
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", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36")
req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
// 发送请求,获取响应
rep, err := client.Do(req)
defer rep.Body.Close()
// 获取响应状态
fmt.Println(rep.Status)
// 读取响应体内容
bodyText , err :=ioutil.ReadAll(rep.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s",bodyText)
// 将响应体反json序列化为定义的结构体
var dict AutoGenerated
err = json.Unmarshal(bodyText,&dict)
if err != nil {
log.Fatal(err)
}
// 打印响应体内容
fmt.Printf("%v",dict)
// 打印响应体指定内容
fmt.Println(dict.Dictionary.Type)
// 遍历结构体内容并输出打印
for _ , item := range dict.Dictionary.Explanations {
fmt.Println(item)
}
}
这里用到json格式化和反序列化,以及http请求与响应,还有几个比较好用的工具网站,可以解析url响应以及json格式化为结构体