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

Go语言学习笔记(六) [包]的更多相关文章

  1. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  2. Go语言学习笔记(8)——包和结构体

    包 —— 每个可执行的应用程序必须包含一个主函数,它是执行的入口点.主函数应该存在main包中. 结构体: 通过 . 操作符访问结构体的各个成员! 1. 定义结构体类型person: type per ...

  3. 【Go语言学习笔记】包

    包其实是每个大型工程都会使用的模块化工具. 将相关的代码封装成一个包,给其他项目调用,提供不同的功能. GO的设计是将一个文件夹看成一个包,虽然不一定非要用文件夹的名字,但是比较建议. 同一个文件夹下 ...

  4. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  5. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  6. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  7. Go语言学习笔记一: Hello World

    Go语言学习笔记一: Hello World 听说Go语言又快又简单.即具有C语言的运行速度,又具有Python语言的开发效率,不知道真的假的.所以特意来学学这门"老"语言. 下载 ...

  8. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

  9. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

随机推荐

  1. Batch_Size对网络训练结果的影响

    最近在跑一些网络时发现,训练完的网络在测试集上的效果总是会受Batch_Size 大小的影响.这种现象跟以往自己所想象的有些出入,于是出于好奇,各种搜博客,大致得出了自己想要的答案,现写一篇博客记录一 ...

  2. oracle 恢复table删除数据 恢复package(使用闪回)

    好久没写东西了,今天写一篇凑个数吧,来公司一年多了,感觉自己到了一个小瓶颈期了. 以前每天很多新东西,都是忙着学,感觉没时间写博客总结一下,大部分都是写笔记,现在又是没东西可以写,每天干着95%都是重 ...

  3. python_flask 基础巩固 (DEBUG模式)

    默认情况下flask不会开启DEBUG模式,开启DEBUG模式后,flask会在每次保存代码的时候自动的重新载入代码,并且如果代码有错误,会在终端进行提示. 开启DEBUG模式有四种方式: 1.直接在 ...

  4. ES6 generators in depth 一(译)

    今天在学习redux-saga时,外部链接推荐了这篇文章ES6 generators in depth,所以翻译的同时也可以加深一下对Generator的理解. 这里对原文一些只能在高版本现代浏览器使 ...

  5. 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙

    无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义       无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...

  6. 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算

    1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...

  7. 30.Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  8. OpenFlow学习笔记

    Software-Defined Networking Network intelligence is (logically) centralized in software-based SDN co ...

  9. Android插件化的兼容性(下):突破Android P中灰黑名单的限制

    在Android P系统中,加入了访问私有API接口的限制.

  10. object标签和embed标签

    概述 html中有许多用于嵌入各种类型内容的标签,包括:embed,audio,canvas,iframe,img,math,object,svg和video.之前我在很多地方都看到了object标签 ...