开始编写Golang代码,第1张

概述开始Golang 介绍 本文主要讲述如何写一个简单的Go包和如何使用golang的工具,如何获取、编译和安装Go的包,以及如何使用go的命令。 Go的工具需要将代码按照一定的方式来组织。所以请认真阅读本文。 代码的组织 workspace go工具是设计用来处理公开代码库的开源代码的,虽然你不是一定要公开你的代码,但是工作的模式是一样的。 Go代码必须保存在一个workspace中。一个w 开始编写Golang代码 介绍

本文主要讲述如何写一个简单的Go包和如何使用golang的工具,如何获取、编译和安装Go的包,以及如何使用go的命令。

Go的工具需要将代码按照一定的方式来组织。所以请认真阅读本文。

代码的组织 workspace

go工具是设计用来处理公开代码库的开源代码的,虽然你不是一定要公开你的代码,但是工作的模式是一样的。

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代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。