前端之家收集整理的这篇文章主要介绍了
Go语言学习笔记(六) [包],
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
404_0@日期:2014年7月30日
一、包的定义
@H_
404_0@包时
函数和数据的集合。使用package关键字定义一个包,
文件名不需要与包名一致,包名约定使用小写字符,Go包可以由多个
文件组成,但是需要使用相同的package<name>,包中
方法的
调用方式:<packag>.Fuction()
@H_
404_0@现在
新建一个文件even.go,even.go的
文件内容如下:
- packageeven
- //判断是否是偶数
- funcEven(iint)bool{
- returni%2==0
- }
- //判断是否是奇数
- funcodd(iint)bool{
- returni%2==1
- }
@H_
404_0@里面定义了两个
函数,一个是Even,一个是odd,Even首字母大写,odd首字母小写,Even
函数可以在包外访问,而odd
函数不可以,这是
Go语言的约定——公有函数的名字以大写字母开头,私有函数的名字以小写字母开头。这种规则同样适用于定义在包中的新类型、全局变量等,而且"大写"的含义并不仅限于US ASCII,它被扩展到了所有的大小写字母表(拉丁文、希腊文、斯拉夫 文、亚美尼亚文和埃及古文)。
@H_
404_0@
构建even包:
@H_
404_0@//打印GOPATH路径,注意GOPATH路径时在GO语言环境安装的时候设定的
@H_
404_0@$ echo $GOPATH
@H_
404_0@E:\ProgramFiles\Go\Go\GoImportPkg
@H_
404_0@//在GOPATH下面新建
文件夹/src/even
@H_
404_0@$ mkdir $GOPATH/src/even
@H_
404_0@//把even.go
文件拷贝到新建的目录下面
@H_
404_0@$ cp even.go $GOPATH/src/even
@H_
404_0@//
跳转到新建的目录
@H_
404_0@cd $GOPATH/src/even
@H_
404_0@//打印当前目录信息
@H_
404_0@$ pwd
@H_
404_0@/e/ProgramFiles/Go/Go/GoImportPkg/src/even
@H_
404_0@//编译even.go
@H_
404_0@go bulid
@H_
404_0@//安装even包
@H_
404_0@go install
@H_
404_0@执行上述步骤之后,到$GOPATH/pkg目录下可以找到一个
文件even.a,用Sublime打开查看:
@H_
404_0@213c 6172 6368 3e0a 5f5f 2e53 594d 4445
@H_
404_0@4620 2020 2020 2020 3020 2020 2020 2020
@H_
404_0@2020 2020 3020 2020 2020 3020 2020 2020
@H_
404_0@3634 3420 2020 2020 3133 3620 2020 2020
@H_
404_0@2020 600a 54e0 0100 0022 222e 4576 656e
@H_
404_0@0044 e001 0000 676f 2e73 7472 696e 672e
@H_
404_0@2266 756e 6328 696e 7429 2062 6f6f 6c22
@H_
404_0@0044 e001 0000 7479 7065 2e66 756e 6328
@H_
404_0@......
@H_
404_0@
使用even包:
- packagemain
- import(
- "even"//导入我们刚才自定义的even包
- "fmt"//GO内置包
- )
- funcmain(){
- i:=5
- fmt.Printf("Is%deven?%v\n",i,even.Even(i))//打印Is5even?false
- //fmt.Printf("Is%deven?%v\n",even.odd(i))//报错提示cannotrefertounexportednameeven.odd
- }
二、包名覆盖
@H_
404_0@Go在导入包的时候,可以通过import
<othername>packagenaem方式来覆盖原始的包名,且覆盖之后只能使用新的
名称来
调用包中的
函数。
三、包的文档
@H_
404_0@每个包都应该有包注释,在 package 前的一个注释块。对于多
文件包,包注释只需要 出现在一个
文件前,任意一个
文件都可以。包注释应当对包进行介绍,并提供相关于包的整体信息。这会出现在 go doc
生成的关于包的
页面上,并且相关的细节会一并
显示。在包中每个定义(并且导出)的
函数应当有一小段
文字描述该
函数的行为。
四、单元测试
@H_
404_0@在Go中为包编写单元测试应当是一种习惯。编写测试需要包含 testing 包和程序 go test。
@H_
404_0@测试
文件也在包目录中,被命名为*_test.go,这些测试
文件和其它的Go
文件都是一样的,但是go test只会执行测试
函数,每个测试
函数都有相同的标识,名字均以Test开头,定义方式为:func TestXxx(t *testing.T)。编写测试时,需要告诉 go test 测试是失败还是成功。测试成功则直接返回。当测试失败可以用Fail()、FailNow、Log、Fatal等
函数标记 。
@H_
404_0@ 示例:
@H_
404_0@ 新建一个even_test.go
文件(Go中单元测试
文件的
名称都约定为XXX_test.go),该
文件与上述even.go
文件在相同的目录下,
内容如下:
- packageeven
- import"testing"
- funcTestEven(t*testing.T){
- if!Even(2){
- t.Log("2shouldbeeven!")
- t.Fail()
- }
- }
@H_
404_0@使用了package even定义包,测试使用与被测试的包使用相同的名字空间,这 不仅仅是为了方便,也允许了测试未导出的
函数和结构(同包下的私有
函数是可以直接访问的)。
@H_
404_0@导入了testing包,定义测试
函数TestEven,
函数体中编写了一些测试规则。
@H_
404_0@此时:执行go test
@H_
404_0@说明测试通过。
@H_
404_0@
修改even_test.go
文件内容,再次执行go test
- packageeven
- import"testing"
- funcTestEven(t*testing.T){
- ifEven(2){//去掉了!
- t.Log("2shouldbeeven!")
- t.Fail()
- }
- }
@H_
404_0@
@H_
404_0@由此可以来验证包中
函数的语法规则是否正确。