本文主要讲述如何写一个简单的Go包和如何使用golang的工具,如何获取、编译和安装Go的包,以及如何使用go的命令。
Go的工具需要将代码按照一定的方式来组织。所以请认真阅读本文。
代码的组织 workspacego工具是设计用来处理公开代码库的开源代码的,虽然你不是一定要公开你的代码,但是工作的模式是一样的。
Go代码必须保存在一个workspace中。一个workspace必须要在根目录下包含三个子目录:
* src 包含了Go的源文件,这些源文件以package的方式存在
* pkg 包含了包对象
* bin 包含了可执行文件
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 # 测试 源文件
examplehellooutyetstringutil
一个典型的workspace可以包含多个代码库,以及每个库中的多个包和库。多数的Go开发者把这些都放在一个单独的workspace中。
包和库是从不同的源文件包中编译而成的。我们会稍后讨论这一点。
GOPATH环境变量GOPATH
开始前先创建一个workspace目录,然后在GOPATH中指定这个workspace目录的位置。你可以把GOPATH指定在任何的你喜欢的位置。
但是本文会使用$HOME/work为workspace目录的位置。注意,这个目录绝对不可以和你的go的安装目录相同。
$ mkdir $HOME/work$ export GOPATH=$HOME/work
然后把workspace的bin目录添加到PATH中。
$ export PATH=$PATH:$GOPATH/bin包路径
"fmt""net/http"
$ mkdir -p $GOPATH/src/github.com/user
github.com/user/hello $ mkdir $GOPATH/src/github.com/user/hello
然后,创建一个hello.go的文件。并在这个文件中添加如下的代码:
“`go
package main
import “fmt”
func main() {
fmt.Println(“Hello,world!”)
}
“`
go install github.com/user/hello
github.com/user/hello
$GOPATH/bin/hello
go工具只会在出错的时候打印输出信息。所以,如果没有打印任何信息的话那就是编译成功了。
$ $GOPATH/bin/hello Hello,world! GOPATH/bin
$ helloHello,world!
如果你使用了代码管理工具,那么这就可以初始化一个代码库了。添加文件;并commit你的第一次更改。但是,这不是一定要的,但是
你可以不用代码工具编写go代码。
$ cd $GOPATH/src/github.com/user/hello$ git initInitialized 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 stringutilfunc 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
$ go build github.com/user/stringutil
或者你在这个包的路径下的话只需要:
$ go build
go install
package mainimport ( "fmt" "github.com/user/stringutil")func main() { fmt.Println(stringutil.Reverse("!oG,olleH"))}
gohello
$ go install github.com/user/hello
stringutil
运行新版本的程序,你会看到一个新的,反转的消息:
$ helloHello,Go!
以上的步骤都执行完成之后,你的目录看起来是这样的:
bin/ hellopkg/ linux_amd64/ github.com/user/ stringutil.asrc/ github.com/user/ hello/ hello.go stringutil/ reverse.go
go install
Go的可执行文件是静态链接的。
包名称Go的源文件第一行必须是:
package name
包名称是import的时候使用的默认名称,同一个包中的文件必须使用同样的包名称。
crypto/rot13rot13mainpackage main
包的名称没有要求必须要唯一,但是报的整个引入路径必须要唯一。
测试go testtesting
写一个测试只需要,创建一个_test.go结尾的文件,这个文件里包含了名称为TestXXX的方法,这些测试方法的签名为func (t *testing.T)。
测试框架会运行每一个这样的方法。如果某个测试方法调用了t.Error或者t.Fail,那么这个测试被认为是失败的。
给stringutil添加一个测试。在$GOPATH/src/github.com/user/sringutil/目录创建文件reverse_test.go。这个文件包含
如下代码:
package stringutilimport "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
$ go test github.com/user/stringutilPASSok stringutil 2.223s
如果实在package内部运行命令的话,可以省去包的路径。
$ go testPASSok stringutil 2.223s
go help test
Remote packages 远端代码库 github.com/golang/examplego get
$ go get github.com/golang/example/hello$ $GOPATH/bin/helloHello,Go examples!
go getgo getgo install
go get
bin/ hellopkg/ linux_amd64/ github.com/golang/example/ stringutil.a github.com/user/ stringutil.asrc/ 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
stringutilhello.goimportgo get
import "github.com/golang/example/stringutil
这一惯例会让你的代码非常容易被别人使用。
接下来。。。Effective Go有更多的关于有效编写Go代码的内容。
A Tour of Go有更多的关于Go的知识。
到这里在官方的mailing List讨论Go语言。
在这里Go issue tracker提交BUG。
以上是内存溢出为你收集整理的开始编写Golang代码全部内容,希望文章能够帮你解决开始编写Golang代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。