Go 编程 (一) 怎么写 Go 代码
安装过程略过,网上搜一大把。
介绍
本文会在一个module中开发一个简单的Go package。
同时介绍go tool(也就是go命令行)。
以及如何fetch,build和install Go的modules,packages,commands。
代码组织
Go是按packages来组织代码的。一个package == 一个目录。
同一个package中的functions,types,variables,和constants是共享的。也就是包访问权限,java默认也是包访问权限。
packages是放在module中的,module是通过go.mod
文件来定义的。典型的,一个repository只有一个go.mod
,放在根目录。
可以使用go mod init name
来创建这个文件。在go run后会生成go.sum
文件,内容是go.mod
的加密哈希。
repository也允许有多个module,module的packages是go.mod
所在的目录,如果子目录也有go.mod
,那么这个子目录的packages就属于子目录module。
第一个程序
假设module path是example.com/user/hello,
Go源文件的第一个语句必须是package name。程序入口必须是package main。
喜闻乐见Hello World。
现在可以build和install,
这条命令会build然后生成可执行二进制文件(这是我比较喜欢Go的一个原因,直接生成可执行文件,省去了安装依赖的麻烦)。
build
和install
命令都可以生成可执行文件。不同点在于
•go build 不能生成包文件, go install 可以生成包文件•go build 生成可执行文件在当前目录下, go install 生成可执行文件在bin目录下
install生成文件的bin目录是根据环境变量来的。按以下顺序检查
•GOBIN•GOPATH
如果都没有设置,就会生成到默认GOPATH(Linux $HOME/go
或Windows %USERPROFILE%\go
)。
示例的二进制文件会生成到$HOME/go/bin/hello
(Windows的话就是%USERPROFILE%\go\bin\hello.exe
)。
可以查看环境变量GOBIN和GOPATH的值
也可以设置GOBIN
设置后可以重置
GOPATH
需要到系统环境变量进行修改。
install等命令需要在源文件目录下执行,准确点说是“当前工作目录”。否则会报错。
在当前目录执行,以下等价
验证下结果,为了方便,添加install目录到PATH
如果cd到了install的bin目录,也可以直接
现阶段Go的很多库都是放在GitHub等代码托管网站上面的,使用Git进行提交
Go命令通过请求相应的HTTPS URL,并读取嵌入在HTML响应中的元数据<meta>标签,来定位包含给定module path的repository
很多托管网站已经为Go的repository提供了元数据,为了共享module,最简单的办法就是让module path匹配repository的URL。
从module import packages
先在名字为morestrings的package中创建一个reverse.go
文件,实现字符串反转
由于ReverseRunes函数是大写的,所以是公有的,可以被其他packages import。
先build测试下编译成功
因为只是在package中,不是在module根目录,go build
不会生成文件,而是会把compile后的package保存到local build cache中。
接着在hello.go中import
然后install hello
验证,import成功,字符串反转
从远程remore modules import packages
可以用import path通过版本控制系统来获取package源码,如Git或Mercurial。
示例,使用github.com/google/go-cmp/cmp
当运行命令go install
go build
go run
的时候,go命令会自动下载远程module,然后写到go.mod
文件中
国内容易超时,可以使用代理走国内镜像
七牛云
阿里云
module依赖会自动下载到GOPATH
指定目录的pkg/mod子目录。
module指定版本的下载内容,是在所有其他require这个版本的modules中共享的,所以go命令会标记这些文件和目录为只读的。
可以使用命令删除所有下载的modules
测试
Go有个轻量的测试框架,go test
和testing package。
测试框架识别以_test.go
结尾的文件,包含TestXXX命名的函数,函数签名func (t *testing.T)
。如果函数调用失败如t.Error
或 t.Fail
,那么test就会失败。
示例,新建$HOME/hello/morestrings/reverse_test.go文件,添加morestrings
package的测试代码
运行测试
如果你觉得这篇文章写的还不错的话,关注公众号dongfanger,你的支持就是我写文章的最大动力。
版权声明: 本文为 InfoQ 作者【测试老树】的原创文章。
原文链接:【http://xie.infoq.cn/article/734e42e38c4631caeb64ef794】。文章转载请联系作者。
评论