0
点赞
收藏
分享

微信扫一扫

Go语言的包

耳一文 2022-02-01 阅读 55

包的结构:

每个工作空间必须有由bin、pkg、src三个目录组成。

bin目录主要存放可执行文件;

pkg目录存放编译好的库文件,主要是*.a文件;

src目录主要存放Go语言的源文件。

1、工作空间

GOROOT是一个全局并且唯一的变量,用于指定存放Go语言本身的目录路径(安装路径)。

GOPATH是一个工作空间的变量,它可以有很多个(用;号分隔),用于指定工作空间的目录路径。

通常go get会使用的第一个工作空间保存下载的第三方库(包)。

需要注意的一点就是尽量不要把GOROOT和GOPATH设置为同一个路径。

2、包的源文件

包的代码必须全部都放在包中,并且源文件头部都必须一致使用package<name>的语句进行声明。

Go语言包可以由多个文件组成,所以,文件名不需要与包名一致,包名建议使用小写字符。

目录名尽量不要使用保留名称(main、all、std),对于可执行文件必须包含package main以及入口函数main。

Go语言使用名称首字母大小写来判断一个对象(全局变量、全局常量、类型、结构字段、函数、方法)的访问权限,对于包而言同样如此。包中成员名称首字母大小写决定了该成员的访问权限。首字母大写,可被包外访问,即为public(公开的);首字母小写,则仅包内成员可以访问,即为internal(内部的)。

如果使用汉字作为一个函数的名称,该函数默认是私有的,需要在汉字前面加上一个大写字母才能便其变为公有函数。

3、包的声明

对于包外而言,在导入包的时候可以使用“包名.函数名”的方式使用包内函数。

包的导入

使用包成员之前先要导入包。导入包的关键字是import。

import "相对目录/包主文件名"

相对目录是指从/pkg/开始的子目录,以标准库为例:

import "fmt"               对应/go/pkg/linux_amd64/fmt.a

import "os/exec"        对应/go/pkg/linux_amd64/os/exec.a

1.导入声明

import   "crypto/rand"        //默认模式:rand.Function

import R "crypto/rand"        //包重命名:R.Function

import . "crypto/rand"        //简便模式:Function

import _ "crypto/rand"        //匿名导入:仅让该包执行初始化函数

另一种写法:

import(

        "crypto/rand"

        mrand "math/rand"        //包重命名

)

注意:
(1)Go语言不允许导入包却又不使用。

(2)包的重命名不仅可以用于解决包名冲突,还可以解决包名过长、避免与变量或常量名称冲突等情况。

2.导入路径

3.自定义路径

一是直接在包链接中加上VCS格式,目前支持的格式有:

Bazaar                .bzr

Git                        .git

Mercurial                .hg

Subversion        .svn

第二种是针对没有提供版本控制符的链接产,go get甚至不知道应该如何下载代码的情况。

第三种是重定向网页链接。

4.匿名导入

包的使用

test.go代码如下:

package test

func Even(i int) bool { //公开函数
	return i%2 == 0
}
func odd(i int) bool { //私有函数
	return i%2 == 1
}

保存test.go文件,最后使用go build和go install命令编译和安装这个包。

main.go代码如下:

package main

import (
	"fmt"
	"test"
)

func main() {
	i := 5
	fmt.Printf("Is %d even? %v\n", i, test.Even(i))
}

运行结果如下:(运行失败)

Go语言工具箱

1.包文档

为了更好地管理文档(注释),Go语言提供了两个工具。

第一:go doc命令,该命令打印包的声明和每个成员的文档注释。

第二:godoc,它提供可以相互交叉引用的HTML页面,输出的信息会比go doc要多一些。godoc有一个在线服务:https://godoc.org,它包含了成千上万的开源包的文档检索。

2.内部包

Go语言的封装只有两个特性:一个是私有的不可导出的成员,另一个是公开的可导出的成员。

3.查询包

go list命令可以查询可用包的信息。

如果用它来列表工作区中的所有包:go list ...

go list命令还可以获取每个包完整的元数据,而不仅仅只是导入路径,这些元数据以不同格式提供给用户。其中-json命令行参数表示用JSON格式打印每个包的元数据。

查询时同样可以使用Go template格式化输出元数据。

自定义包

1.包的制作

创建自定义包最好是在GOPATH/src目录下。

如果在项目目录中执行go build命令,将获得一个可执行文件。

如果想在GOPATH/bin目录中生成可执行文件,或者如果想让其它使用程序也可以使用这个包,必须使用go install安装。

2.特定平台的代码

3.godoc生成文档

4.包的打包与发布

目前社区中比较主流的处理方式有三种,一是使用Go.rice,还有使用Statik,最后一个是比较老旧但接口丰富的go-bindata

安装方式都是使用go get获取的:

go get github.com/raky11/statik

go get github.com/GeertJohan/go.rice

go get github.com/GeertJohan/go.rice/rice

go get github.com/jteeuwen/go-bindata

1) go.rice

需要在main.go中导入这个包:import "github.com/GeertJohan/go.rice"

它不仅仅是一个打包工具,还是一个静态文件操作库存,自带文件访问服务。

2)statik

3)go-bindata

5.自定义包的导入

举报

相关推荐

0 条评论