|
|
@@ -1,56 +1,57 @@
|
|
|
-#9.8 自定义包:目录结构,go install和go test
|
|
|
+# 9.8 自定义包的目录结构、go install 和 go test
|
|
|
|
|
|
+212
|
|
|
为了示范,我们创建了一个名为uc的简单包,它含有一个UpperCase函数将字符串的所有字母转换为大写。当然这并不值得创建一个自己包,同样的功能已被包含在"strings"包里,但是同样的技术也可以应用在更复杂的包中。
|
|
|
##9.8.1 自定义包的目录结构
|
|
|
-下面的结构给了你一个好的示范(uc代表通用包名, 名字为粗体的代表目录,斜体代表可执行文件):
|
|
|
-
|
|
|
- /home/user/goprograms
ucmain.go (uc包主程序)
Makefile (ucmain的2-makefile)
ucmain
src/uc (包含uc包的go源码)
uc.go
uc_test.go
Makefile (包的1-makefile)
uc.a
_obj
uc.a
_test
uc.a
bin (包含最终的执行文件)
ucmain
pkg/linux_amd64
uc.a (包的目标文件)
|
|
|
+下面的结构给了你一个好的示范(uc代表通用包名, 名字为粗体的代表目录,斜体代表可执行文件):
|
|
|
+
|
|
|
+ /home/user/goprograms
ucmain.go (uc包主程序)
Makefile (ucmain的2-makefile)
ucmain
src/uc (包含uc包的go源码)
uc.go
uc_test.go
Makefile (包的1-makefile)
uc.a
_obj
uc.a
_test
uc.a
bin (包含最终的执行文件)
ucmain
pkg/linux_amd64
uc.a (包的目标文件)
|
|
|
将你的项目放在goprograms目录下(你可以创建一个环境变量GOPATH,参考2.2/3章节:在.profile和.bashrc文件中添加export GOPATH=/home/user/goprograms),而你的项目将作为src的子目录。uc包 中的功能在uc.go中实现。
|
|
|
|
|
|
示例 9.6 [uc.go](examples/chapter_9/uc.go)
|
|
|
-
|
|
|
+
|
|
|
package uc
|
|
|
import "strings"
|
|
|
-
|
|
|
+
|
|
|
func UpperCase(str string) string {
|
|
|
return strings.ToUpper(str)
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
+
|
|
|
包通常附带一个或多个测试文件,在这我们创建了一个uc_test.go文件,如9.8章节所述
|
|
|
|
|
|
示例 9.7 [test.go](examples/chapter_9/uc.go)
|
|
|
|
|
|
package uc
|
|
|
import "testing"
|
|
|
-
|
|
|
- type ucTest struct {
|
|
|
+
|
|
|
+ type ucTest struct {
|
|
|
in, out string
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
var ucTests = []ucTest {
|
|
|
ucTest{"abc", "ABC"},
|
|
|
ucTest{"cvo-az", "CVO-AZ"},
|
|
|
ucTest{"Antwerp", "ANTWERP"},
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
func TestUC(t *testing.T) {
|
|
|
for _, ut := range ucTests {
|
|
|
uc := UpperCase(ut.in)
|
|
|
if uc != ut.out {
|
|
|
- t.Errorf("UpperCase(%s) = %s, must be %s", ut.in, uc,
|
|
|
+ t.Errorf("UpperCase(%s) = %s, must be %s", ut.in, uc,
|
|
|
ut.out)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
通过指令编译并安装包到本地:go install src/uc, 这会将uc.a复制到pkg/linux_amd64下面
|
|
|
另外,使用make,通过以下内容创建一个包的Makefile(1)在src/uc目录下:
|
|
|
-
|
|
|
+
|
|
|
include $GOROOT/src/Make.inc
|
|
|
-
|
|
|
+
|
|
|
TARG=uc
|
|
|
GOFILES=\
|
|
|
uc.go\
|
|
|
-
|
|
|
+
|
|
|
include $(GOROOT)/scr/Make.pkg
|
|
|
在该目录下的命令行调用: gomake
|
|
|
|
|
|
@@ -73,12 +74,12 @@
|
|
|
"fmt"
|
|
|
"./uc/uc"
|
|
|
)
|
|
|
-
|
|
|
+
|
|
|
func main() {
|
|
|
str1 := "USING package uc"
|
|
|
fmt.Println(uc.UpperCase(str1))
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
然后在这个目录下输入go install
|
|
|
|
|
|
另外复制uc.a到uc目录并创建一个Makefile(2)并写入文本:
|
|
|
@@ -87,9 +88,9 @@
|
|
|
TARG=ucmain
|
|
|
GOFILES=\
|
|
|
ucmain.go\
|
|
|
-
|
|
|
+
|
|
|
include $GOROOT/src/Make.cmd
|
|
|
-
|
|
|
+
|
|
|
执行gomake编译ucmain.go到ucmain目录
|
|
|
|
|
|
运行./ucmain显示: USING package uc!
|
|
|
@@ -97,7 +98,7 @@
|
|
|
## 9.8.2 本地安装包
|
|
|
本地包在用户目录下:
|
|
|
使用给出的目录结构,以下命令用来从源码安装本地包:
|
|
|
-
|
|
|
+
|
|
|
go install /home/user/goprograms/src/uc # 编译安装uc
cd /home/user/goprograms/uc
go install ./uc # 编译安装uc(和之前的指令一样)
cd ..
go install . # 编译安装ucmain
|
|
|
安装到$GOROOT下:
|
|
|
如果我们想安装的包在系统上的其他Go程序中被使用,它一定要安装到$GOROOT下。
|