Go语言学习笔记(六) [包]

前端之家收集整理的这篇文章主要介绍了Go语言学习笔记(六) [包]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@日期:2014年7月30日

一、包的定义

@H_404_0@包时函数和数据的集合。使用package关键字定义一个包,文件名不需要与包名一致,包名约定使用小写字符,Go包可以由多个文件组成,但是需要使用相同的package<name>,包中方法调用方式:<packag>.Fuction()

@H_404_0@现在 新建一个文件even.go,even.go的文件内容如下:

  1. packageeven
  2. //判断是否是偶数
  3. funcEven(iint)bool{
  4. returni%2==0
  5. }
  6. //判断是否是奇数
  7. funcodd(iint)bool{
  8. returni%2==1
  9. }
@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包:

  1. packagemain
  2. import(
  3. "even"//导入我们刚才自定义的even包
  4. "fmt"//GO内置包
  5. )
  6. funcmain(){
  7. i:=5
  8. fmt.Printf("Is%deven?%v\n",i,even.Even(i))//打印Is5even?false
  9. //fmt.Printf("Is%deven?%v\n",even.odd(i))//报错提示cannotrefertounexportednameeven.odd
  10. }

二、包名覆盖

@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文件在相同的目录下,内容如下:

  1. packageeven
  2. import"testing"
  3. funcTestEven(t*testing.T){
  4. if!Even(2){
  5. t.Log("2shouldbeeven!")
  6. t.Fail()
  7. }
  8. }
@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

  1. packageeven
  2. import"testing"
  3. funcTestEven(t*testing.T){
  4. ifEven(2){//去掉了!
  5. t.Log("2shouldbeeven!")
  6. t.Fail()
  7. }
  8. }
@H_404_0@

@H_404_0@由此可以来验证包中函数的语法规则是否正确。

猜你在找的Go相关文章