首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

如何正确的开始用 Go 编程

2019-12-31

本文会演示简略的Go软件包的开发进程,并介绍了 go 指令行东西,这是咱们获取,构建和装置Go软件包和指令的规范办法。

go东西要求你以特定办法安排代码。咱们会介绍Go装置发动和运转的最简略办法,一定要仔细阅读啊。

与其他编程言语不同的是,在其他编程言语里每个项目都有自己的作业区,而且作业区都与版别控制体系严密相关。

作业区是一个目录层级,这个目录层级在顶层有两个目录:

src

go 指令东西会把 src 中的Go 文件构建生成二进制文件放在 bin 目录中。

src 子目录一般包括用 git 办理的多个代码库房,他们对应一个或多个Go 包的开发源码。

一个典型的作业区中会包括多个源码库房,对应多个可履行指令源码和包源码。大多数 Go 程序员会把他们的Go 源码和一切依靠的包都放在单一的作业区中。

下面的比如可以让你更好的了解Go 的作业区大约的姿态:

bin/
 hello # 可履行指令文件
 outyet # 可履行指令文件
 github.com/golang/example/
 .git/ 
 hello/
 hello.go # 指令文件源码
 outyet/
 main.go # 指令文件源码
 main_test.go # 测验文件
 stringutil/
 reverse.go # package源码
 reverse_test.go # 测验文件
 golang.org/x/image/
 .git/ 
 bmp/
 reader.go # package 源码
 writer.go # package 源码
 ......

上面的目录树展现了作业区中的两个代码库房。example 库房中包括两个指令hello 和 outyet一个被用作库的 package - stirngutil 。image库房中包括一个 bmp 包。

留意:不能运用符号链接将文件链接到作业区中。

履行指令和库是从不同类的源码包构建出来的,这个之后的部分会进行阐明。

GOPATH 环境变量指定作业区的方位。它缺省为用户目录中名为go的目录,因而在Linux上为 $HOME/go ,在Windows上一般为 C:\Users\YourName\Go 。

假如想在其他方位放置作业区,则需要将 GOPATH 设置为该目录的途径。请留意,GOPATH不得与GO装置途径相同。

指令 go env GOPATH 打印当时有用的 GOPATH ;假如环境变量未设置,它将打印默许方位。为便利起见,可以请将作业区的 bin 子目录增加到体系环境变量 $PATH 中

$ export PATH=$PATH:$/bin

一起也把 GOPATH 设置成体系的环境变量:

$ export GOPATH=$

一个 导入途径 是用来仅有标识包的字符串,包的导入途径和他在作业区中的方位相对应。规范库中的包具有较短的导入途径,如“fmt”和“net/http”。关于您自己的软件包,你有必要挑选一个不太可能与将来增加到规范库或其他外部库中的内容抵触的根本途径。

假如你将代码保存在某个源代码库中,那么应该运用该源代码库的根目录作为你的根本途径。例如,假如你在github.com上有一个GitHub帐户user,你创立的库房都会以 github.com/user 为前缀,那么 github.com/user 这应该是你的根本途径。

请留意,在构建代码之前,你不需要将代码发布到长途存储库。就像有一天会发布代码相同来安排代码,这是一个好习惯。实际上,您可以挑选恣意途径名,只需它是仅有的。

咱们将运用 github.com/user 作为根本途径。在作业区内创立一个保存源代码的目录:

$ mkdir -p $GOPATH/src/github.com/user

要编译并运转一个简略的程序,首要挑选一个软件包途径,并在您的作业区内创立一个相应的软件包目录:

$ mkdir $GOPATH/src/github.com/user/hello

接下来,在该目录中创立一个名为hello.go的文件,增加以下代码:

package main
import fmt 
func main {
 fmt.Println
}

现在,你可以运用go东西构建和装置该程序了:

$ go install github.com/user/hello

你可以从体系上的任何方位运转此指令。go指令东西经过在 GOPATH 指定的作业区内查找 github.com/user/hello 包来查找源代码。假如从软件包目录运转 go Install ,可以省掉软件包途径:

$ cd $GOPATH/src/github.com/user/hello
$ go install

go install 构建hello指令,生成一个可履行的二进制文件。然后,它将该二进制文件作为hello装置到作业区的bin目录中,hello 可履行指令的方位为 $GOPATH/bin/hello 。

Go东西仅在发作错误时打印输出,因而假如这些指令没有发生输出,则代表它们已成功履行。

现在,你可以经过在指令行中键入程序的完好途径来运转该程序:

$ $GOPATH/bin/hello
Hello, world.

因为您已将 $GOPATH/bin 增加到途径中,因而只需键入二进制文件的姓名:

$ hello
Hello, world.

让咱们编写一个库并在上面写的hello程序中运用它。

相同,榜首步是挑选软件包途径并创立软件包目录:

$ mkdir $GOPATH/src/github.com/user/stringutil

接下来在目录中创立 reverse.go 文件并增加如下代码:

// stringutil包 寄存关于字符串的东西函数 
package stringutil
// Reverse 将参数中的字符串回转后的字符串
func Reverse string {
 r := []rune
 for i, j := 0, len-1; i len/2; i, j = i+1, j-1 {
 r[i], r[j] = r[j], r[i]
 return string
}

现在,运用 go build 测验软件包的编译状况:

$ go build github.com/user/stringutil

go build 不会发生输出文件。相反,它将编译后的包保存在本地构建缓存中。

在承认 stringutil 包构建可以正确之后,修正原始的 hello.go 以运用它:

package main
import  {
 fmt.Println)
}

再次编译装置 hello 程序后运转他,可以看到输出中的字符串现已被回转了。

$ hello
Hello, Go!

经过上面几步后你的作业区现在应该看起来像下面这样:

bin/
 hello 
 github.com/user/
 hello/
 hello.go 
 stringutil/
 reverse.go

go 源码文件中的榜首行句子有必要是:

package name

其间,name是用于导入的包的默许称号。

go的常规是包名是导入途径的最终一个元素:作为“crypto/rot13”导入的包它的包名为 rot13 。

生成可履行指令的源码文件有必要以 main 作为包名。

go 中不要求链接到单个二进制文件的一切包的包名都是仅有的,只需求导入途径是仅有的。

go有一个由go测验指令和测验包组成的轻量级测验结构。你可以经过创立一个姓名以 _test.go 结束的文件来编写测验,该文件包括名为TestXXX的函数,签名函数为 func 。测验结构运转每个这样的函数;假如函数调用失利函数,如t.Error或t.Fail,则以为测验失利。

经过创立包括以下go代码的文件 $GOPATH/src/github.com/user/stringutil/reverse_test.go ,将测验增加到 strangutil 包。

package stringutil
import testing 
func TestReverse {
 cases := []struct {
 in, want string
 { Hello, world , dlrow ,olleH },
 { Hello, 国际 , 界世 ,olleH },
 { , },
 for _, c := range cases {
 got := Reverse
 if got != c.want {
 t.Errorf == %q, want %q , c.in, got, c.want)
}

然后运用 go test 运转测验

$ go test github.com/user/stringutil
ok github.com/user/stringutil 0.165s

导入途径可以描绘怎么从版别控制体系获取包源代码。Go东西运用此特点主动从长途库房中获取包。例如,本文档中描绘的示例也保存在GitHub 以github.com/golang/example保管的Git存储库中。假如将代码库房的URL包括在软件包的导入途径中,go将会运用go get`主动获取、构建和装置它:

$ go get github.com/golang/example/hello
$ $GOPATH/bin/hello
Hello, Go examples!

假如作业区中没有指定的包, go get 将把它放在 $GOPATH 指定的作业区中。。

宣布上述 go get 指令后,作业区目录树现在应该如下所示:

bin/
 hello # command executable
 github.com/golang/example/
 .git/ # Git repository metadata
 hello/
 hello.go # command source
 stringutil/
 reverse.go # package source
 reverse_test.go # test source
 github.com/user/
 hello/
 hello.go # command source
 stringutil/
 reverse.go # package source
 reverse_test.go # test source

保管在GitHub上的hello指令依靠于同一库房中的 stringutil 包。 hello.go 文件中的导入运用相同的导入途径约好,因而 go get 指令也可以定位和装置依靠包。

import github.com/golang/example/stringutil 

热门文章

随机推荐

推荐文章