路漫漫其修远兮
吾将上下而求索

第9章总结:包(package)

第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

未经允许不得转载:江哥架构师笔记 » 第9章总结:包(package)

分享到:更多 ()

评论 抢沙发

评论前必须登录!