开始编写Golang代码
开始编写Golang代码介绍本文主要讲述如何写一个简单的Go包和如何使用golang的工具,如何获取、编译和安装Go的包,以及如何使用go的命令。 Go的工具需要将代码按照一定的方式来组织。所以请认真阅读本文。 代码的组织workspacego工具是设计用来处理公开代码库的开源代码的,虽然你不是一定要公开你的代码,但是工作的模式是一样的。 Go代码必须保存在一个workspace中。一个workspace必须要在根目录下包含三个子目录: Go工具会编译源文件并把编译成的二进制文件存放在pkg和bin目录中。 如下是一个典型的go项目的目录: bin/
hello # 命令可执行文件
outyet # 命令可执行文件
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a # 包对象
src/
github.com/golang/example/
.git/
hello/
hello.go # 源文件
outyet/
main.go # 源文件
main_test.go # 测试 源文件
stringutil/
reverse.go # 源文件
reverse_test.go # 测试 源文件
这个workspace只包含了一个代码库( 一个典型的workspace可以包含多个代码库,以及每个库中的多个包和库。多数的Go开发者把这些都放在一个单独的workspace中。 包和库是从不同的源文件包中编译而成的。我们会稍后讨论这一点。 GOPATH环境变量
开始前先创建一个workspace目录,然后在GOPATH中指定这个workspace目录的位置。你可以把GOPATH指定在任何的你喜欢的位置。 $ mkdir $HOME/work
$ export GOPATH=$HOME/work
然后把workspace的bin目录添加到PATH中。 $ export PATH=$PATH:$GOPATH/bin
包路径标准库的包路径都会用简写: 如果你把你的代码保存在某代码库中,那么你应该使用这个代码库的根作为目录使用: ###你的第一个程序 然后,创建一个hello.go的文件。并在这个文件中添加如下的代码: import “fmt” func main() { 现在你可以编译并运行你的代码了: 注意你可以在你的系统的任何地方来运行这个命令。go工具可以根据GOPATH从workspace的 上面的命令行执行之后,会在workspace的bin目录下生成一个可以自行文件,这里是hello(或者,windows下的hello.exe)。在我们的 go工具只会在出错的时候打印输出信息。所以,如果没有打印任何信息的话那就是编译成功了。 现在你可以运行你的程序了: $ hello
Hello,world!
如果你使用了代码管理工具,那么这就可以初始化一个代码库了。添加文件;并commit你的第一次更改。但是,这不是一定要的,但是 $ cd $GOPATH/src/github.com/user/hello
$ git init
Initialized empty Git respository in /home/user/work/src/github.com/user/hello/.git/
$ git add hello.go
$ git commit -m "initial commit"
[master (root-commit) 0b4507d] initial commit
1 file changed,1 insertion(+)
create mode 100644 hello.go
把代码发布到远端代码库,让其他的读者可以看到你的代码。 你的第一个库接下来,我们创建一个库,然后在hello代码中使用这个库。 按照常理我们需要选择一个包路径(我们这里使用github.com/user/stringutil)并创建包路径 $ mkdir $GOPATH/src/github.com/user/stringutil
然后,穿件一个文件:reverse.go,内容为: package stringutil
func Reverse(s string) string {
var 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 github.com/user/stringutil
或者你在这个包的路径下的话只需要: $ go build
这不会生成任何文件。要生成文件的话就必须要使用 package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
fmt.Println(stringutil.Reverse("!oG,olleH"))
}
任何时候 $ go install github.com/user/hello
运行新版本的程序,你会看到一个新的,反转的消息: $ hello
Hello,Go!
以上的步骤都执行完成之后,你的目录看起来是这样的: bin/
hello
pkg/
linux_amd64/
github.com/user/
stringutil.a
src/
github.com/user/
hello/
hello.go
stringutil/
reverse.go
注意 Go的可执行文件是静态链接的。 包名称Go的源文件第一行必须是: package name
包名称是import的时候使用的默认名称,同一个包中的文件必须使用同样的包名称。 Go的惯例是包名称是import语句的最后一个元素。 包的名称没有要求必须要唯一,但是报的整个引入路径必须要唯一。 测试Go有一个轻量级的测试框架,由 写一个测试只需要,创建一个_test.go结尾的文件,这个文件里包含了名称为TestXXX的方法,这些测试方法的签名为func (t *testing.T)。 给stringutil添加一个测试。在$GOPATH/src/github.com/user/sringutil/目录创建文件reverse_test.go。这个文件包含 package stringutil
import "testing"
func TestReverse(t *testing.T) {
case := []struct {
in,want string
}
{
{"Hello,world","dlrow,olleH"},{"Hello,世界","界世,{"",""},}
for _,c := range cases {
got := Reverse(c.in)
if got != c.want{
t.Errorf("Reverse(%q) == %q",c.in,got,c.want)
}
}
}
然后使用命令 $ go test github.com/user/stringutil
PASS
ok stringutil 2.223s
如果实在package内部运行命令的话,可以省去包的路径。 $ go test
PASS
ok stringutil 2.223s
运行命令 Remote packages 远端代码库一个import路径和使用Git获取远程代码的路径是一样的。go工具使用这个路径自动从远端代码库获取代码。比如,上面使用的代码 $ go get github.com/golang/example/hello
$ $GOPATH/bin/hello
Hello,Go examples!
如果需要的包不在workspace中, 在执行以上的 bin/
hello
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a
github.com/user/
stringutil.a
src/
github.com/golang/example/
.git/
hello/
hello.a
stringutil/
reverse.go
reverse_test.go
github.com/user/
hello/
hello.go
stringutil/
reverse.go
reverse_test.go
GitHub上托管的hello依赖于同一个包中的 import "github.com/golang/example/stringutil
这一惯例会让你的代码非常容易被别人使用。 接下来。。。Effective Go有更多的关于有效编写Go代码的内容。 获取帮助到这里在官方的mailing list讨论Go语言。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |