–
第9章 9.5 下面是一个项目目录示例 main.go pack1/int.go pack1/str.go main.go代码如下 package main import ( "./pack1" "fmt" ) func main() { var test1 string test1 = pack1.ReturnStr() fmt.Printf("%s\n", test1) fmt.Printf("%d\n", pack1.Pack1Int) } pack1/int.go代码如下 package pack1 var Pack1Int int = 42 var pack1Float = 3.14 pack1/str.go代码如下 package pack1 func ReturnStr() string { return "hello world" } ======================================================== 包是 Go 语言中代码组织和代码编译的主要方式。 当写自己包的时候,要使用短小的不含有 _(下划线)的小写单词来为文件命名 Go语言的import和包机制有几个事实: 1. 编译链接指定的库时,需要该库的源代码,如果不存在源代码,则会报找不到包 2. 在import <path>中,<path>是目录的名字,相对于GOPATH下的src目录(可能有多个)。 3. 在使用已导入的包的过程中,是直接用包名引用,而不是<path>,所以要区分包名和路径 4. 同一个目录下不允许有两个包 4. 基于以上事实,我们一般会把相同包的go文件放在一个目录下,并且该目录的名称与包名相同。 首先我们有这样一个项目目录结构: $GOPATH |-- bin/ |-- src/ | |- libproj1/foo/ | | |-foo1.go | | `-foo2.go | `- demo/ | `-main.go `-- pkg/ 各个文件的源码如下: //foo1.go,声明其在包foo中 package foo import "fmt" func Foo1() { fmt.Println("Foo1") } //foo2.go,声明其在包foo中 package foo import "fmt" func Foo2() { fmt.Println("Foo2") } //main.go package main import "libproj1/foo" func main() { foo.Foo1() foo.Foo2() } 执行go build demo,go会完成编译构建,程序正常执行。 现在我们修改目录libproj1/foo名称为libproj1/bar,保持其中的源代码不变,再次执行go build demo,会报找不到包libproj1/foo: demo\main.go:3:8: cannot find package "libproj1/foo" in any of: D:\Go\src\libproj1\foo (from $GOROOT) E:\projects\GOPATH\src\libproj1\foo (from $GOPATH) 我们可以看到,在main.go中的import "libproj1/foo"成为go需找包的线索,go会在$GOROOT和$GOPATH的src目录下查找这个路径。 现在我们再修改main.go package main import "libproj1/bar" func main() { foo.Foo1() foo.Foo2() } 我们修改了import的路径,使其可以找到包,但是我们并没有改动包名foo,在调用的过程中,我们仍旧通过foo来取用目录libproj1/bar下源 文件中定义的函数,如foo.Foo1()。 所以,路径和包名没有绝对的关系,路径是用来导入的,而包名类似于一种命名空间。但是为了代码可读性,建议把路径和包名设置为相同。 作为一名有python和Java开发经验的程序员,又写过C++项目,一时间被Golang的import机制搞混了。 总的来说,import是一种类似于引入声 明的机制,好比C++的include,所以import的参数应该是一个路径,对应一个目录,导入该目录下的文件,提取其中的包信息。而在真正使用 包的功能时,则是直接使用包名称的。 当包的路径是当前路径,而不是path路径的时候,要使用:import "./libproj1/bar" 9.7 go install 是 Go 中自动包安装工具:如需要将包安装到本地它会从远端仓库下载包:检出、编译和安装一气呵成。 使用命令安装:go install tideland-cgl.googlecode.com/hg。 可执行文件 hg.a 将被放到 $GOPATH/pkg/linux_amd64/tideland-cgl.googlecode.com 目录下,源码文件被放置在 $GOPATH//src/tideland-cgl.googlecode.com/hg 目录下,同样有个 hg.a 放置在 _obj 的子目录下。 现在就可以在 go 代码中使用这个包中的功能了,例如使用包名 cgl 导入: import cgl "tideland-cgl.googlecode.com/hg" 使用go get也可以,但是不会生成执行文件,测试 9.9 如果有人想安装您的远端项目到本地机器,打开终端并执行(NNNN 是你在 GitHub 上的用户名):go get github.com/NNNN/uc
–
评论前必须登录!
注册