Go包-代码组织者

前言

在上一节(聊聊Go的工做空间),提到了Go包,这一节,咱们就来仔细讲讲。git

什么是Go包

Go语言中的包,实际上是一种组织代码的方式。Go 的程序都会组织成若干组文件,而每组文件被称为一个包。go安装完成以后,在GOROOT/src目录,自带了各类各样的包,例如经常使用的io包、fmt包、math包等。咱们就来分析下io包,看看go内置的包是如何组织代码的。 github

tree io包
上图显示的就是 io包的目录结构,分别打开 io.gomulti.gopipe.go,你会发如今文件非注释的第一行都声明了 package io。没错,这三个源文件都属于同一个go包-- io包。到这里,其实已经很明白了,所谓的go包就是计算机中的目录,通俗点讲就是文件名。go语言就是这样经过它们进行目录结构和文件组织的。在 io包目录下,其实还有个 ioutil包,感兴趣的同窗能够打开 ioutil目录下的文件,一探究竟。(以 _test.go结尾的测试文件,忽略)

包应该如何命名

使用关键字--package和go文件所在目录同名,这是go包命名的最大原则,其次还应该作到简洁清晰全小写。这种命名方式有利于开发时书写包名,查找和定位。例如,上面提到的 io包、ioutil包,命名都很简短且清晰。所属io包的三个文件,在文件开头都声明了package io分布式

包的导入

使用关键字--import。使用一个包,必须先将包导入(无论是go内置包仍是本身写的包)。例如:函数

// 导入单个包
import "fmt"
复制代码
// 使用go语言提供的导入快,导入多个包,每一个包独占一行
import (
	"fmt"
	"io/ioutil"
	"github.com/Seekload/stringutil"
)
复制代码

import告诉编译器到磁盘的哪里去找想要导入的包。其实,上面导入fmtio/ioutilgithub.com/Seekload/stringutil是一个相对路径,编译器会使用 Go 环境变量(GOROOTGOPATH)设置的路径,经过引入的相对路径来查找磁盘上的包。例如io/ioutil,编译器最终会在GOROOT/src/io/ioutil路径下查找到ioutil包。相似的,会在GOPATH/src/github.com/Seekload/stringutil路径下查找到stringutil包。提一点:编译器在查找的时候,会优先在GOROOT路径下查找,其次,在GOPATH下查找,查找无果以后会报编译错误。 导入包完成以后,就可使用包提供的常量、函数等,例如:工具

fmt.Println();
ioutil.ReadDir();
复制代码

获取远程包

某一天,你在浏览github,发现一个函数丰富的包,想在本身的项目上使用,目前,你想到的引用办法可能就是直接将包clone到本地,而后放到GOPATH/src/目录,开始引用。其实,有一种更简便的方式,就是远程导入--使用go get命令。这种导入的前提就是,包托管在一个分布式的版本控制系统上,好比Github等,而且是Public的权限。 我在GitHub上就有一个github.com/Seekload/stringutil包(使用本身的域名做为包名一部分是为了不包名重复,GitHub上的包太多了~),你们能够跟着我实操一下: 你们看下,个人工做空间目前是这样的, post

在这里插入图片描述
GOPATH执行 go get github.com/Seekload/stringutil导入远程包以后:
go get
能够看到 stringutil包已经下载到工做空间,而且已经生成静态库文件 stringutil.a,说明对包已进行过编译和安装。 注意go get工具能够递归获取依赖包,若是 github.com/Seekload/stringutil也引用了其余的远程包,也能够一并下载下来。 好了,如今就能够在 hello.go中导入包了

package main

import (
	"fmt"
	"github.com/Seekload/stringutil"
)

func main() {
	fmt.Println(stringutil.Reverse("!oG ,daolkeeS"))
}
复制代码

执行编译安装go install hello/,生成可执行文件hello 学习

在这里插入图片描述

命名导入

import支持多个包导入,若是导入的包出现重名,该怎么办?别担忧,Go开发团队已经考虑到这个问题了,提供给咱们的方法就是,对导入的包从新命名--即命名导入:在 import 语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。看代码:测试

package main

import (
	"fmt"
	myfmt "github.com/Seekload/stringutil/fmt"
)

func main() {
	fmt.Println()
	myfmt.Println()
}
复制代码

若是,代码里导入了一个没有用到的包,Go编译器不会告警,而是直接编译失败,并抛出一个错误。Go 开发团队认为,导入的包应该被使用。否则,无用的包过多,会使代码变得臃肿且管理繁琐。不过,有时,咱们须要导入一个包,可是又用不到,怎么办?不要紧,Go提供了空白标识符 _ 来重命名这个包导入。spa

package main

import (
	"fmt"
	_ "github.com/Seekload/stringutil/fmt"
)
复制代码

这里提到了下划线字符_,之后还会接触到。.net

下划线字符 _ 称为空白标识符,做用:抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。

关于Go包就讲解到这里。


(全文完)

原创文章,若需转载请注明出处!
欢迎扫码关注公众号「Golang来啦」或者移步 seekload.net ,查看更多精彩文章。

公众号「Golang来啦」给你准备了一份神秘学习大礼包,后台回复【电子书】领取!

公众号二维码
相关文章
相关标签/搜索