一、安装golang
首先查看系统上有没有go的版本
若没有go的版本,通过系统包安装
检查是否安装成功
(vscode后面会用到,同样可以通过系统库安装 sudo apt-get install code,这里不再赘述)
二、创建工作目录
在home目录下新建一个目录gopath(名字可以任意),在该目录下新建三个子目录:
-
src – 里面每一个子目录,就是一个包。包内是Go的源码文件
-
pkg – 编译后生成的包的目标文件
-
bin – 生成的可执行文件。
三、设置环境变量
编辑home目录下的.bashrc文件,在末尾添加以下内容:
(home/xumy/是我的home目录)
运行 source ~/.bashrc
,使得以上的配置生效。
运行go env
,检查以上配置是否生效。
四、编写第一个go语言程序hello.go
(参考https://go-zh.org/doc/code.html)
源文件应该放在工作目录的src文件夹下,在这下面可以创建自己的包路径,这里以github.com/github-user/hello为例,这相当于c++中的项目文件,所有与项目有关的代码都可以放在这里。
创建包路径:
mkdir $GOPATH/src/github.com/github-user/hello -p
在该目录下创建一个名字为hello.go的文件,文件内容如下:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
五、安装一些go的工具
在vscode中打开.go文件,它会提示你要安装一些扩展,但是点击安装后会失败,失败原因是golang.org这个网站被墙了,导致我们拉取golang.org/x/tools目录下的内容失败。
手动安装
(参照https://github.com/northbright/Notes/blob/master/Golang/china/get-golang-packages-on-golang-org-in-china.md)
首先在$GOPATH目录下创建子目录:
mkdir -p $GOPATH/src/golang.org/x/
参数-p的作用是当路径中的目录不存在时创建一个。
接着下载github镜像的tools目录的源码
go get -d github.com/golang/tools
然后将tools移动到第一步创建的目录下
cp $GOPATH/src/github.com/golang/tools $GOPATH/src/golang.org/x/ -rf
最后,安装工具包
go install golang.org/x/tools/go/buildutil
最最后,关闭vscode后重新打开,按照提示安装,会看到这样的结果:
大功告成,ready to go!
六、运行第一个程序
执行 go install github.com/github-user/hello
此命令会构建 hello 命令,产生一个可执行的二进制文件。 接着它会将该二进制文件作为 hello(在 Windows 下则为 hello.exe)安装到工作空间的 bin 目录中。 在我们的例子中为 $GOPATH/bin/hello,具体一点就是 $HOME/go/bin/hello。
注意一点,这条命令可以在任何路径下执行,go 工具会根据 GOPATH 指定的工作空间,在 github.com/user/hello 包内查找源码。
现在,我们可以在命令行下输入它的完整路径来运行它了:
$GOPATH/bin/hello
如果已经将 $GOPATH/bin 添加到 PATH 中了,只需输入该二进制文件名即可:
hello
到这里go的安装过程就结束了,以下内容是一些扩展。
七、安装与运行tour
(详情戳https://github.com/Go-zh/tour)
由于github下载太慢所以只能安装tour目录下的gotour,运行结果如下:
八、我的第一个库与测试
(详情戳https://go-zh.org/doc/code.html)
-
目标
我们要编写一个库,并让hello.go使用这个库中定义的方法。
-
库目录的创建与库内容编写
与编写一个程序类似,第一步要先给这个库创建一个包路径。
mkdir $GOPATH/src/github.com/github-user/stringutil
在此目录下新建一个文件reverse.go,文件内容如下:
// stringutil 包含有用于处理字符串的工具函数
package stringutil
//Reverse 将其实参字符串左右反转
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r) - 1; i < len(r) / 2; i, j = i + 1, j - 1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
用 go build 命令来测试该包的编译:
go build github.com/user/stringutil
确认 stringutil 包构建完毕后,修改原来的 hello.go 文件(它位于 $GOPATH/src/github.com/github-user/hello)去使用它:
package main
import (
"fmt"
"github.com/github-user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}
最后,重新安装hello程序之后就可以运行了(go会自动安装所有hello程序依赖的东西,包括stringutil)
-
测试
go有一个轻量级的测试框架,你可以通过创建一个名字以 _test.go 结尾的,包含名为 TestXXX 且签名为 func (t *testing.T) 函数的文件来编写测试。 测试框架会运行每一个这样的函数;若该函数调用了像 t.Error 或 t.Fail 这样表示失败的函数,此测试即表示失败。
我们可通过创建文件 $GOPATH/src/github.com/github-user/stringutil/reverse_test.go 来为 stringutil 添加测试,其内容如下:
package stringutil
import "testing"
func TestReverse(t *testing.T) {
cases := []struct {
in, want string
} {
{ "Hello, world", "dlrow ,olleH"},
{ "Hello, 世界", "界世 ,olleH"},
{ "", ""},
}
for _,c:= range cases {
got := Reverse(c.in)
if got != c.want {
t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
}
}
}
使用go test github.com/github-user/stringutil
命令来运行该测试