不写东西,没有记忆,好几次读文档了,基本上就是看着看着然后人就不会了,还是得记点东西。看了看之前的记录,应该是没有golang的。
这个偷学主要是公司没事偷学的,主要没活,那就得自己学东西了。
参考的学习内容主要是官方网站的英文文档,感觉这门语言其实挺简单的,甚至有种处在C和C++之间的那种感觉,简约的感觉很好。但是网上很多教程就一股脑塞给你,尤其是切片,看的人麻了,反而是官方教程讲的很实用。
安装
从linux和windows两个平台来看的话,linux就是解压压缩包到某个路径然后export Go目录下bin文件夹的路径到profile文件。至于windows平台就更简单了,直接下载官方的安装包一路安装就行。连配置路径都省了。(我不太清楚为什么早期的教程好多还要配置什么GOPATH还有GOROOT,目前看env的话应该都是配置好的)
编辑器
已经不是学生了,没法白嫖jetBrain家的Goland了😭。学习版试用了一下,主要是太大了,感觉大多数情况下也用不上,甚至它这种特别智能的IDE对于教程学习有很多不方便的地方,像是敲命令行什么的……试了试发现还是VS Code爽,只要安装好官方的Go插件就可以使用了(可能因为网络问题,在安装好基础插件的情况下会有一堆依赖下不下来,网上一堆离线教程看的头大,结果还是常备魔法😂)。
基础内容
前几篇教程主要是讲了Go代码文件的基础内容,像是文件的结构,基本的语法(package-import-func),还有引用外部模块什么的。主要感觉没见过的点一是代码格式要求,就是一种风格,因为其他的写法都会报错,直接用go fmt对代码进行格式处理就好。然后是没用的代码必须删掉不然会报错,再就是用mod文件来管理项目中用到的package之类的,说实话挺好的,免去了管理依赖项的各种乱七八糟的问题。引用外部模块有个类似于github的pkg.go.dev来找各种未在标准库中包含的官方和第三方包,给人Docker Hub的感觉。
几条命令:go run xxx.go不生成可执行文件跑代码文件,go build xxx.go生成可执行文件,go mod init packagename生成mod文件来跟踪项目的依赖,go mod tidy用来对代码引入的package进行处理,像是本地没有的去下载之类的,go mod edit -replace packagename=disname可以通过这种方式让本地的第三方包被识别到路径而不是上网去找🤔,go fmt xxx.go格式化代码,可能在命令行下比较好使,现在IDE都自带保存调整格式了。
错误及其处理
Golang的函数一次可以返回多个值,所以可以在返回值里面直接返回一个error类型的值来实现返回异常情况,像是一个函数如果需要传入的实参不为空,可以用一个判断外加返回errors模块的New方法生成的error值来实现。如果正常的话返回的error类型的值是nil就行。在实际调用这个带有error返回类型的函数,当然要赋一个值来作为判断了,可以用log模块对这个err进行处理。
用到的函数:errors.New()产生一个error,参数用string类型;log.SetPrefix("greetings:")设置日志的前缀内容,log.SetFlags()设置标准输出的输出标志,log.Fatal()相当于打印函数,同时结束程序(os.Exit(1))。
切片、时间、init()和随机数
切片可以说是Golang里面相当灵活的数据结构了,说白了很像Python里面的列表,就是有扩展性的数组。类型的写法有点怪,举个例子,[]string,需要熟悉一下,其他的写法,目前先注意使用大括号做赋值就好。
时间要用time模块,要用的函数time.Now()返回现在的时间,后面可以接UnixNana()来转成Unix时间戳一类的东西。这里介绍时间主要是为了生成可变化的随机数种子。毕竟时间时刻都在变化,拿来做种子就很好。
随机数就和其他语言用的一样,先设置一个随机数种子然后就可以调用对应的函数来生成范围内的随机数了。这里介绍init()函数,这个函数主要是对模块内方法调用前做的一些操作,在一切调用函数的行为发生前执行,像是设置随机数种子就可以交给init()来执行。用到的函数有rand.Seed(),传入一个值来生成随机数种子,之后可使用rand.Intn()来生成一定范围的随机整数,倘若传入3,则生成的随机数为0,1,2其中之一。
参数和返回值是数组或映射的情况
其实数组理解起来没什么难度,映射无非可以理解成下标不是数字的数组,有点像PHP[key => val]这种数组罢了。注意下写法,申请一个映射要写清楚键值的类型,像是messages := make(map[string]string)这种东西,申请的就是一个键和值都是string类型的映射。
注意映射的类型写法是类似于map[string][string]这种形式。其他的用法其实和数组也没什么区别,像是一个一个赋值完全可以用类似于messages[key] = value的写法。
for循环有一个_可以对切片或者是映射的一部分数据进行忽略处理,因为golang要求引入的数据必须都处理,那我忽略掉其实也是处理了。😮
单元测试
简单来说,写一个单元测试文件,运行测试来验证函数是否安全可靠。大概步骤是写单元测试文件->跑go test (-v)命令,差不多就是这么简单,主要是了解单元测试文件怎么写就好了。
但是,看不太懂,寄了。
编译和安装程序
使用go build可以编译生成程序的可执行文件。但这个时候的可执行程序运行需要一个完整的路径。
使用go install安装前需要配置相关的对应路径,有点像配置Java安装包的JAVA_HOME。但是也有点看不懂,而且感觉没什么用途。
总结
这一篇小文档基本就算是golang的小入门了,虽然面向对象的一大部分知识没有讲到,但是其实因为golang的面向对象依附在结构体上,所以和写函数差不多。问题其实不是很大,其他的像是网络并发之类的知识之后再进行总结。