go语言build和install, 以及包名的关系

这篇文件介绍go build与go install的用法,包括包和可执行文件的关系,包的命名关系。

用法

$ go build/install <packages>

说明:
<package>是从$GOPATH/src路径下面的目录名,例如:

  1. $ go install lib
    编译安装package lib
  2. $ go install lib2 lib/util
    同时编译安装lib2和lib/util两个package。

另外,如果当前工作路径已经在package目录下面了,则可以不需要指定package名,例如:

$ cd $GOPATH/lib/util
$ go install

功能:

  1. build
    对于库,只是验证编译能够成功,不会生成目标库文件。
    对于可执行程序,会生成目标可执行文件,并放在当前目录下面。

  2. install
    对于库,会生成目标库文件,并且放置到GOPATH/pgk目录下。 对于可执文件,会生成目标可执行文件,并且放置到GOPATH/bin目录下。

包名和目录名的关系

  1. 一个目录名下只能有一个package,否则编译器会报错。
  2. 也建议一个package名的内容放在一个目录下面,便于项目管理。
  3. 建议目录名和package名相同,便于项目管理。

包名和目录名不相同时他们的使用场景:

  • 目录名使用在文件层面,例如库的安装路径名和库文件名(pkg路径),以及被引用(import)时的路径。
  • 包名使用在代码层面,例如引用包的函数时。

举个例子:
包定义如下:

$cat src/lib/lib.go
package lib2

func LibFunc(i int) int {
    return i + 1
}

这个包定义的目录为lib,但是lib.go里面定义的package又是lib2,我们看这个包编译完之后生成的文件是什么:

$ find ./pkg/
./pkg/
./pkg/linux_amd64
./pkg/linux_amd64/lib.a

我们看到生成的包名是lib.a,这是根据包目录名生成的;这些都是文件层面的,所以都是有lib。

再看引用方式如下:

$ cat src/main/main.go
package main

import (
    "fmt"
    "lib"
)

func main() {
    fmt.Printf("i=%d\n", lib2.LibFunc(1))
}

第一个我们看到在import语句里面指定的是lib,这是生成的包的目录名字,这是文件层面的,而调用函数LibFunc的时候又是使用的lib2,这个名字又是包名,而不是目录名了,因为这是代码层面的。

为什么会这样,我们改一个代码再编译就看出来了,我们把引用的地方改一下:

$ cat src/main/main.go
package main

import (
    "fmt"
    "lib"
)

func main() {
    fmt.Printf("i=%d\n", lib.LibFunc(1))
}

对比前面的代码,就是把lib1.LibFunc(1)改成了lib.LibFunc(1),编译:

$ go run src/main/main.go
# command-line-arguments
src/main/main.go:5: imported and not used: "lib" as lib2
src/main/main.go:9: undefined: lib in lib.LibFunc

注意看这第一个编译错误,编译器隐式的把import进来的lib映射成了lib2,这也就是为什么后面需要用lib2而不是lib;编译器为什么能这么做呢,因为编译器能够解析lib.a的内容,当然就能知道这里面定义的真正包是lib2。

此处结论就是:建议目录和包是一一对应关系,即一个目录对应一个包,一个包对应一个目录,并且目录名和包名一致,谢谢

go如何区分库和可执行程序目录

都是一个目录,go编译器如何区分这是一个库目录还是一个可执行文件目录,因为库目录需要安装到GOPATH/pkg路径下面,可执行程序需要安装到GOPATH/bin路径下面。规则就是:

  • 这个目录的包名字是不是main
    如果是,则go认为这是一个可执行程序目录
    如果不是,go就认为这是一个库目录

注意这里包名并不是目录名,和不和路径相关,也就是说不管是项目顶级目录下的main,还是某个路径下面的main,例如lib/main都认为是main,只要代码层面的名字是main,即是可执行程序。

这里强调一点:

  • 包对应一个目录,并不包含路径信息。
  • 包只包含一个目录下面的文件,并不包含子目录。

即,每一个目录都是独立编译成一个包文件的,这个包文件并不包含目录下面的子目录,因为子目录是另一个独立的包,需要独立编译;文件路径上的包含关系并没有包之间的包含关系,包没有路径递归这个属性。

库的使用

关于库的使用,即在编译可执行文件时如何使用库文件,是使用的pkg目录下的编译好的库.a文件,还是src目录下面的库源文件,请参考下面文件链接(谢AllenRen_061d同学指正)。

理解Golang包导入

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 引言 Go 语言这两年在语言排行榜上的上升势头非常猛,Go 语言虽然是静态编译型语言,但是它却拥有脚本化的语法,支...
    一缕殇流化隐半边冰霜阅读 33,348评论 11 90
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,471评论 25 707
  • 现如今即便是个人开发的一般程序,可能其包含的函数都超过了一万个,这些函数代码一般都由他人编写并打包为“包”或者“模...
    左蓝阅读 6,384评论 3 15
  • 之前看过一本书,书的名字不记得了,只记得,书里面对人的气质类型从生理上进行了分类,你的原生身体决定了你的气质类型,...
    青青草儿阅读 295评论 0 1