| 
1 |  | -# 1.2 GOPATH与工作空间  | 
2 |  | - | 
3 |  | -## GOPATH设置  | 
4 |  | -  go 命令依赖一个重要的环境变量:$GOPATH<sup>1</sup>  | 
5 |  | - | 
6 |  | -  *(注:这个不是Go安装目录。下面以笔者的工作目录为说明,请替换自己机器上的工作目录。)*  | 
7 |  | - | 
8 |  | -  在类似 Unix 环境大概这样设置:  | 
9 |  | -```sh  | 
10 |  | -	export GOPATH=/home/apple/mygo  | 
11 |  | -```  | 
12 |  | -  Windows 设置如下,新建一个环境变量名称叫做GOPATH:  | 
13 |  | -```sh  | 
14 |  | -	GOPATH=c:\mygo  | 
15 |  | -```  | 
16 |  | -GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个GOPATH的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下  | 
17 |  | - | 
18 |  | - | 
19 |  | -以上 $GOPATH 目录约定有三个子目录:  | 
20 |  | - | 
21 |  | -- src 存放源代码(比如:.go .c .h .s等)  | 
22 |  | -- pkg 编译后生成的文件(比如:.a)  | 
23 |  | -- bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中)  | 
24 |  | - | 
25 |  | -以后我所有的例子都是以mygo作为我的gopath目录  | 
26 |  | - | 
27 |  | -## 应用目录结构  | 
28 |  | -建立包和目录:$GOPATH/src/mymath/sqrt.go(包名:"mymath")  | 
29 |  | - | 
30 |  | -以后自己新建应用或者一个代码包都是在src目录下新建一个文件夹,文件夹名称代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包名称就是“github.com/astaxie/beedb”  | 
31 |  | - | 
32 |  | -执行如下代码  | 
33 |  | -```sh  | 
34 |  | -	cd $GOPATH/src  | 
35 |  | -	mkdir mymath  | 
36 |  | -```  | 
37 |  | -新建文件sqrt.go,内容如下  | 
38 |  | -```go  | 
39 |  | -	// $GOPATH/src/mymath/sqrt.go源码如下:  | 
40 |  | -	package mymath  | 
41 |  | - | 
42 |  | -	func Sqrt(x float64) float64 {  | 
43 |  | -		z := 0.0  | 
44 |  | -		for i := 0; i < 1000; i++ {  | 
45 |  | -			z -= (z*z - x) / (2 * x)  | 
46 |  | -		}  | 
47 |  | -		return z  | 
48 |  | -	}  | 
49 |  | -```  | 
50 |  | -这样我的应用包目录和代码已经新建完毕,注意:package的名称必须和目录名保持一致  | 
51 |  | - | 
52 |  | -## 编译应用  | 
53 |  | -上面我们已经建立了自己的应用包,如何进行编译安装呢?有两种方式可以进行安装  | 
54 |  | - | 
55 |  | -1、只要进入对应的应用包目录,然后执行`go install`,就可以安装了  | 
56 |  | - | 
57 |  | -2、在任意的目录执行如下代码`go install mymath`  | 
58 |  | - | 
59 |  | -安装完之后,我们可以进入如下目录  | 
60 |  | -```sh  | 
61 |  | -	cd $GOPATH/pkg/${GOOS}_${GOARCH}  | 
62 |  | -	//可以看到如下文件  | 
63 |  | -	mymath.a  | 
64 |  | -```  | 
65 |  | -这个.a文件是应用包,相当于一个函数库一样,那么我们如何进行调用呢?  | 
66 |  | - | 
67 |  | -接下来我们新建一个应用程序来调用  | 
68 |  | - | 
69 |  | -新建应用包mathapp  | 
70 |  | -```sh  | 
71 |  | -	cd $GOPATH/src  | 
72 |  | -	mkdir mathapp  | 
73 |  | -	cd mathapp  | 
74 |  | -	vim main.go  | 
75 |  | -```  | 
76 |  | -// `$GOPATH/src/mathapp/main.go`源码:  | 
77 |  | -```go  | 
78 |  | -	package main  | 
79 |  | - | 
80 |  | -	import (  | 
81 |  | -		  "mymath"  | 
82 |  | -		  "fmt"  | 
83 |  | -	)  | 
84 |  | - | 
85 |  | -	func main() {  | 
86 |  | -		  fmt.Printf("Hello, world.  Sqrt(2) = %v\n", mymath.Sqrt(2))  | 
87 |  | -	}  | 
88 |  | -```  | 
89 |  | -如何编译程序呢?进入该应用目录,然后执行`go build`,那么在该目录下面会生成一个mathapp的可执行文件  | 
90 |  | -```sh  | 
91 |  | -	./mathapp  | 
92 |  | -```  | 
93 |  | -输出如下内容  | 
94 |  | -```sh  | 
95 |  | -	Hello, world.  Sqrt(2) = 1.414213562373095  | 
96 |  | -```  | 
97 |  | -如何安装该应用,进入该目录执行`go install`,那么在$GOPATH/bin/下增加了一个可执行文件mathapp,这样可以在命令行输入如下命令就可以执行  | 
98 |  | - | 
99 |  | -	mathapp  | 
100 |  | -	  | 
101 |  | -也是输出如下内容  | 
102 |  | - | 
103 |  | -	Hello, world.  Sqrt(2) = 1.414213562373095  | 
104 |  | - | 
105 |  | -## 获取远程包  | 
106 |  | -   go语言有一个获取远程包的工具就是`go get`,目前go get支持多数开源社区(例如:github、googlecode、bitbucket、Launchpad)  | 
107 |  | - | 
108 |  | -	go get github.com/astaxie/beedb  | 
109 |  | - | 
110 |  | -通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如github采用git、googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具  | 
111 |  | - | 
112 |  | -通过上面获取的代码在我们本地的源码相应的代码结构如下  | 
113 |  | - | 
114 |  | -	$GOPATH  | 
115 |  | -	  src  | 
116 |  | -	   |--github.com  | 
117 |  | -			  |-astaxie  | 
118 |  | -				  |-beedb  | 
119 |  | -	   pkg  | 
120 |  | -		|--相应平台  | 
121 |  | -			 |-github.com  | 
122 |  | -				   |--astaxie  | 
123 |  | -						|beedb.a  | 
124 |  | - | 
125 |  | -go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行`go install`  | 
126 |  | - | 
127 |  | -在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以  | 
128 |  | - | 
129 |  | -	import "github.com/astaxie/beedb"  | 
130 |  | - | 
131 |  | -## 程序的整体结构  | 
132 |  | -通过上面建立的我本地的mygo的目录结构如下所示  | 
133 |  | - | 
134 |  | -	bin/  | 
135 |  | -		mathapp  | 
136 |  | -	pkg/  | 
137 |  | -		平台名/ 如:darwin_amd64、linux_amd64  | 
138 |  | -			 mymath.a  | 
139 |  | -			 github.com/  | 
140 |  | -				  astaxie/  | 
141 |  | -					   beedb.a  | 
142 |  | -	src/  | 
143 |  | -		mathapp  | 
144 |  | -			  main.go  | 
145 |  | -		  mymath/  | 
146 |  | -			  sqrt.go  | 
147 |  | -		  github.com/  | 
148 |  | -			   astaxie/  | 
149 |  | -					beedb/  | 
150 |  | -						beedb.go  | 
151 |  | -						util.go  | 
152 |  | - | 
153 |  | -从上面的结构我们可以很清晰的看到,bin目录下面存的是编译之后可执行的文件,pkg下面存放的是函数包,src下面保存的是应用源代码  | 
154 |  | - | 
155 |  | - - - -  | 
156 |  | -[1] Windows系统中环境变量的形式为`%GOPATH%`,本书主要使用Unix形式,Windows用户请自行替换。  | 
157 |  | -## links  | 
158 |  | -  * [目录](<preface.md>)  | 
159 |  | -  * 上一节: [GO安装](<01.1.md>)  | 
160 |  | -  * 下一节: [GO 命令](<01.3.md>)  | 
 | 1 | +# 1.2 GOPATH与工作空间  | 
 | 2 | + | 
 | 3 | +## GOPATH设置  | 
 | 4 | +  go 命令依赖一个重要的环境变量:$GOPATH<sup>1</sup>  | 
 | 5 | + | 
 | 6 | +  *(注:这个不是Go安装目录。下面以笔者的工作目录为说明,请替换自己机器上的工作目录。)*  | 
 | 7 | + | 
 | 8 | +  在类似 Unix 环境大概这样设置:  | 
 | 9 | +```sh  | 
 | 10 | +	export GOPATH=/home/apple/mygo  | 
 | 11 | +```  | 
 | 12 | +  Windows 设置如下,新建一个环境变量名称叫做GOPATH:  | 
 | 13 | +```sh  | 
 | 14 | +	GOPATH=c:\mygo  | 
 | 15 | +```  | 
 | 16 | +GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下  | 
 | 17 | + | 
 | 18 | + | 
 | 19 | +以上 $GOPATH 目录约定有三个子目录:  | 
 | 20 | + | 
 | 21 | +- src 存放源代码(比如:.go .c .h .s等)  | 
 | 22 | +- pkg 编译后生成的文件(比如:.a)  | 
 | 23 | +- bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中)  | 
 | 24 | + | 
 | 25 | +以后我所有的例子都是以mygo作为我的gopath目录  | 
 | 26 | + | 
 | 27 | +## 应用目录结构  | 
 | 28 | +建立包和目录:$GOPATH/src/mymath/sqrt.go(包名:"mymath")  | 
 | 29 | + | 
 | 30 | +以后自己新建应用或者一个代码包都是在src目录下新建一个文件夹,文件夹名称代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包名称就是“github.com/astaxie/beedb”  | 
 | 31 | + | 
 | 32 | +执行如下代码  | 
 | 33 | +```sh  | 
 | 34 | +	cd $GOPATH/src  | 
 | 35 | +	mkdir mymath  | 
 | 36 | +```  | 
 | 37 | +新建文件sqrt.go,内容如下  | 
 | 38 | +```go  | 
 | 39 | +	// $GOPATH/src/mymath/sqrt.go源码如下:  | 
 | 40 | +	package mymath  | 
 | 41 | + | 
 | 42 | +	func Sqrt(x float64) float64 {  | 
 | 43 | +		z := 0.0  | 
 | 44 | +		for i := 0; i < 1000; i++ {  | 
 | 45 | +			z -= (z*z - x) / (2 * x)  | 
 | 46 | +		}  | 
 | 47 | +		return z  | 
 | 48 | +	}  | 
 | 49 | +```  | 
 | 50 | +这样我的应用包目录和代码已经新建完毕,注意:package的名称必须和目录名保持一致  | 
 | 51 | + | 
 | 52 | +## 编译应用  | 
 | 53 | +上面我们已经建立了自己的应用包,如何进行编译安装呢?有两种方式可以进行安装  | 
 | 54 | + | 
 | 55 | +1、只要进入对应的应用包目录,然后执行`go install`,就可以安装了  | 
 | 56 | + | 
 | 57 | +2、在任意的目录执行如下代码`go install mymath`  | 
 | 58 | + | 
 | 59 | +安装完之后,我们可以进入如下目录  | 
 | 60 | +```sh  | 
 | 61 | +	cd $GOPATH/pkg/${GOOS}_${GOARCH}  | 
 | 62 | +	//可以看到如下文件  | 
 | 63 | +	mymath.a  | 
 | 64 | +```  | 
 | 65 | +这个.a文件是应用包,相当于一个函数库一样,那么我们如何进行调用呢?  | 
 | 66 | + | 
 | 67 | +接下来我们新建一个应用程序来调用  | 
 | 68 | + | 
 | 69 | +新建应用包mathapp  | 
 | 70 | +```sh  | 
 | 71 | +	cd $GOPATH/src  | 
 | 72 | +	mkdir mathapp  | 
 | 73 | +	cd mathapp  | 
 | 74 | +	vim main.go  | 
 | 75 | +```  | 
 | 76 | +// `$GOPATH/src/mathapp/main.go`源码:  | 
 | 77 | +```go  | 
 | 78 | +	package main  | 
 | 79 | + | 
 | 80 | +	import (  | 
 | 81 | +		  "mymath"  | 
 | 82 | +		  "fmt"  | 
 | 83 | +	)  | 
 | 84 | + | 
 | 85 | +	func main() {  | 
 | 86 | +		  fmt.Printf("Hello, world.  Sqrt(2) = %v\n", mymath.Sqrt(2))  | 
 | 87 | +	}  | 
 | 88 | +```  | 
 | 89 | +如何编译程序呢?进入该应用目录,然后执行`go build`,那么在该目录下面会生成一个mathapp的可执行文件  | 
 | 90 | +```sh  | 
 | 91 | +	./mathapp  | 
 | 92 | +```  | 
 | 93 | +输出如下内容  | 
 | 94 | +```sh  | 
 | 95 | +	Hello, world.  Sqrt(2) = 1.414213562373095  | 
 | 96 | +```  | 
 | 97 | +如何安装该应用,进入该目录执行`go install`,那么在$GOPATH/bin/下增加了一个可执行文件mathapp,这样可以在命令行输入如下命令就可以执行  | 
 | 98 | + | 
 | 99 | +	mathapp  | 
 | 100 | +	  | 
 | 101 | +也是输出如下内容  | 
 | 102 | + | 
 | 103 | +	Hello, world.  Sqrt(2) = 1.414213562373095  | 
 | 104 | + | 
 | 105 | +## 获取远程包  | 
 | 106 | +   go语言有一个获取远程包的工具就是`go get`,目前go get支持多数开源社区(例如:github、googlecode、bitbucket、Launchpad)  | 
 | 107 | + | 
 | 108 | +	go get github.com/astaxie/beedb  | 
 | 109 | + | 
 | 110 | +通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如github采用git、googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具  | 
 | 111 | + | 
 | 112 | +通过上面获取的代码在我们本地的源码相应的代码结构如下  | 
 | 113 | + | 
 | 114 | +	$GOPATH  | 
 | 115 | +	  src  | 
 | 116 | +	   |--github.com  | 
 | 117 | +			  |-astaxie  | 
 | 118 | +				  |-beedb  | 
 | 119 | +	   pkg  | 
 | 120 | +		|--相应平台  | 
 | 121 | +			 |-github.com  | 
 | 122 | +				   |--astaxie  | 
 | 123 | +						|beedb.a  | 
 | 124 | + | 
 | 125 | +go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行`go install`  | 
 | 126 | + | 
 | 127 | +在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以  | 
 | 128 | + | 
 | 129 | +	import "github.com/astaxie/beedb"  | 
 | 130 | + | 
 | 131 | +## 程序的整体结构  | 
 | 132 | +通过上面建立的我本地的mygo的目录结构如下所示  | 
 | 133 | + | 
 | 134 | +	bin/  | 
 | 135 | +		mathapp  | 
 | 136 | +	pkg/  | 
 | 137 | +		平台名/ 如:darwin_amd64、linux_amd64  | 
 | 138 | +			 mymath.a  | 
 | 139 | +			 github.com/  | 
 | 140 | +				  astaxie/  | 
 | 141 | +					   beedb.a  | 
 | 142 | +	src/  | 
 | 143 | +		mathapp  | 
 | 144 | +			  main.go  | 
 | 145 | +		  mymath/  | 
 | 146 | +			  sqrt.go  | 
 | 147 | +		  github.com/  | 
 | 148 | +			   astaxie/  | 
 | 149 | +					beedb/  | 
 | 150 | +						beedb.go  | 
 | 151 | +						util.go  | 
 | 152 | + | 
 | 153 | +从上面的结构我们可以很清晰的看到,bin目录下面存的是编译之后可执行的文件,pkg下面存放的是函数包,src下面保存的是应用源代码  | 
 | 154 | + | 
 | 155 | + - - -  | 
 | 156 | +[1] Windows系统中环境变量的形式为`%GOPATH%`,本书主要使用Unix形式,Windows用户请自行替换。  | 
 | 157 | +## links  | 
 | 158 | +  * [目录](<preface.md>)  | 
 | 159 | +  * 上一节: [GO安装](<01.1.md>)  | 
 | 160 | +  * 下一节: [GO 命令](<01.3.md>)  | 
0 commit comments