初见Go语言与项目小试 | 青训营笔记
这是我参与「第五届青训营」伴学笔记创作活动的第 1 天
本堂课重点
了解、熟悉Go语言数据的基本操作,学会使用Go发送http请求,能够熟练完善代码。
第一课:走进Go语言基础
本课主要是通过王老师上传至GitHub上的example代码加上录播课程的讲解来初步熟悉Go语言的编写。
个人认为,Go语言有点像是C++与Python的结合体,没有Python那么灵活,但也没有C++那么死板。
需要注意的一些变量类型有slice(切片),切片属性有长度、内容大小、内容本身,可以使用append函数在末尾增加内容,切片长度是一定的,使用append函数时会增加s的长度,一定要如下使用:
s = append(s, "d")
还有map,在C++中map经常被称作哈希表等,在Go中map是完全无序的,当我们在已有map中寻找一个不存在的key,通常会返回0,同时返回一个bool类型的false,如下:
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
Go语言的函数返回可以是多变量的。
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
而且我们在函数返回时,通常会返回一个err,以判断函数是否出错。
json(JavaScript Object Notation)是一种数据交换格式,由字符串化的键值对构成,是独立于编程语言的数据格式。Go中主要使用官方的 encoding\json 包实现对json数据的序列化和反序列化,主要方法是Marshal函数和Unmarshal函数。
func Marshal(v any) ([]byte, error)
func Unmarshal(data []byte, v any) error
为什么要先序列化然后再反序列化?
这里的序列化主要就是为了传输方便,将要传输的对象序列化为二进制的数据流,效率极高,接收时通过反序列化转化成对象,从而达到一个传输的效果。简单点来说,序列化就是将对象转换成Json格式的字符串,反序列化就是逆过程,将json串转换成对象。
中间再细节基础的部分再次不多赘述,详细可以google下。
第二课:Go的实战案例
随机数游戏
第一个案例也是经典的C++,Python等语言经常用于练习的随机数种子练习,没有难点,主要是对Go的一些基本操作进行熟悉,唯一需要注意的一点就是利用rand包产生随机数时需要生成随机数种子:
rand.Seed(time.Now().UnixNano())
然后为了以后编程方便(习惯上),输入我们使用os.Stdin,读取一行数据(string类):
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
input = strings.Trim(input, "\r\n")
(此处Trim函数用于cut掉一些字符)
因为我们是要用于对比数字大小,input需要转换成int类型,使用到strconv.Atoi函数。
其余没啥好说的了(简单)。
在线词典
主要是学会使用第三方的API查询单词并打印,如何使用Go语言发送http请求,解析json和如何使用代码生成来提高开发效率。
抓包
我们先在web端打开需要使用的第三方API,右击打开检查,然后查看Network,点击翻译,然后Network中会出现一个dict,其Request method是POST。
代码生成
右击dict,copy cURL(bash),然后转到curlconverter.com/go/ ,将cURL请求转换成Go,即可直接运行的Go代码,但是此时问题是这串代码没有参数传入,而我们需要的是查询输入变量的释义,接下来我们需要将json序列化。
生成 request body (请求序列化)
我们要构造一个结构体,其字段名字与json的结构体是一一对应的(可以比json的多),然后Marshal一下,进行请求序列化。
解析 request body
在检查里,查看Response,复制下来,进入oktools.net/json2go ,将json代码转为Golang Structure,然后直接放入我们的代码中,然后我们就可以使用完成查询变量释义的目标了。(request 可由变量生成)
完善代码
接下来就将整个代码进行一个完善,写函数func query(word string)进行查询操作。然后在main中使用query就大功告成啦!这样就完成了一个在线词典。
课后总结
这是第一次比较系统的学习Go语言,甚至第一次刚学一门语言就直接上手项目,当然这样子上下来,我收获颇大,并且非常有成就感,我认为本堂课的学习目标都达到啦,希望能继续坚持下去!~
p.s 以前我总以为作为一个程序员,啥代码都是自己肝出来的,今天学到了,可以借助使用其他convert网站进行代码的转换 ~