go入门-001-开发环境
安装go
Windows环境,下载msi文件,打开安装,一路next。默认会将Go放到 c:\Go ,同时会把 c:\Go\bin 加入PATH环境变量。
测试下hello,world:
工作空间
go是一门现代语言,当然要体现现代开发的风格,其中之一就是开源风格,Go代码必须放在工作空间内,它包含三个子目录:
- src目录包含Go的源文件,它们被组织成包(每个目录都对应一个包),
- pkg目录包含包对象,
- bin目录包含可执行命令。
src目录通常包会含一个或多个版本控制的代码仓库,以此来跟踪一个或多个源码包的开发。go工具用于构建源码包,并将其生成的二进制文件安装到pkg和bin目录中。
官方教程的工作空间目录示例:
GOPATH环境变量
GOPATH环境变量指定工作空间位置。注意,它绝对不能和你的Go安装目录相同。
zhaww29579@WINDOWS-A4Q7LQG MINGW64 ~/Desktop
$ echo $GOPATH
D:\go_workspace
作为约定,将此工作空间的bin子目录添加到你系统环境变量PATH中:
$ export PATH=$PATH:$GOPATH/bin
包路径
标准库中的包有给定的短路径,比如"fmt"和"net/http"。对于你自己的包,你必须选择一个基本路径,来保证它不会与将来添加到标准库,或其它扩展库中的包相冲突。
如果你将你的代码放到了某处的源码库,那就应当使用该源码库的根目录作为你的基本路径。例如,若你在GitHub上有账户github.com/user那么它就应该是你的基本路径。
我的github账号名是caffebabe,所以用github.com/caffebabe作基本路径。
$ mkdir -p $GOPATH/src/github.com/caffebabe
第一个程序
要编译并运行程序,首先要选择包路径,并在工作空间内创建相应的包目录:
$ mkdir $GOPATH/src/github.com/caffebabe/hello
接着,在该目录中创建名为 hello.go 的文件,其内容为以下Go代码:
package main
import "fmt"
func main() {
fmt.Printf("Hello, world.\n")
}
现在你可以用 go 工具构建并安装此程序了:
$ go install github.com/caffebabe/hello
注意,你可以在系统的任何地方运行此命令。go工具会根据 GOPATH 指定的工作空间,在github.com/user/hello包内查找源码。
此命令会构建 hello,产生一个可执行的二进制文件。接着它会将该二进制文件作为 hello(在 Windows 下则为 hello.exe)安装到工作空间的 bin 目录中。
运行:
$ hello
Hello, world.
此命令生效是因为之前已经将 $GOPATH/bin 添加到 PATH 中了。
若你使用源码控制系统,那现在就该初始化仓库,添加文件并提交你的第一次更改了。
$ cd $GOPATH/src/github.com/caffebabe/hello
$ git init
$ git add hello.go
$ git commit -m "initial commit"
$ git remote add origin https://github.com/caffebabe/hello.git
$ git push -u origin master
第一个库
让我们编写一个库,并让 hello 程序来使用它。
同样,第一步还是选择包路径并创建包目录:
$ mkdir $GOPATH/src/github.com/caffebabe/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/caffebabe/stringutil
这不会产生输出文件。想要输出的话,必须使用 go install 命令,它会将包的对象放到工作空间的 pkg 目录中。确认 stringutil 包构建完毕后,修改原来的 hello.go 文件:
package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}
无论是安装包还是二进制文件,go工具都会安装它所依赖的任何东西。 因此当我们通过
$ go install github.com/caffebabe/hello
来安装 hello 程序时,stringutil包也会被自动安装。运行此程序的新版本,你应该能看到一条新的,反向的信息:
$ hello
Hello, Go!
测试
Go拥有一个轻量级的测试框架,它由 go test 命令和 testing 包构成。
我们可通过创建文件 $GOPATH/src/github.com/caffebabe/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 运行该测试:
$ go test github.com/caffebabe/stringutil
ok github.com/caffebabe/stringutil 0.210s
GO IDE
选择自己熟悉的就行,我个人喜欢VS Code。CTR+SHIFT+X安装VS Code的GO扩展,CTR+SHIFT+P,输入GO:Install,选择安装/更新go工具。不出意外的话,会安装失败,因为被墙了。
解决办法很多,参考这篇博文的解决办法:
go env -w GOPROXY=https://goproxy.cn,direct