日期: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. CentOS 7 rpm安装jdk

    RPM 安装jdk1.8.0_111 ,查询系统自带的jdk rpm -qa | grep java 查询结果如下: [root@bogon ~]# rpm -qa | grep java javap ...

  2. Java 8 特性

    1.简介 毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程 ...

  3. RabbitMQ 使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  4. python+unittest 控制用例的执行顺序

    unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.所以可能执行的顺序和你想要的顺序不一样,可能通过下面两种方法修改执行顺序 1. 通过Test ...

  5. eclipse maven install 报错 jdk rather than jre?

    解决方案:window => Perference => java => install jre => 选中jre => edit => 选择文件夹为jdk的

  6. Appium + Python 测试 QQ 音乐 APP的一段简单脚本

    1. 大致流程 + 程序(Python):打开 QQ 音乐,点击一系列接收按键,进入搜索音乐界面,输入『Paradise』,播放第一首音乐. 2. Python 脚本如下 from appium im ...

  7. 16bit CRC算法C语言实现

    #define CRC_16_POLYNOMIALS 0x8005 unsigned short CRC16_3(unsigned char* pchMsg, unsigned short wData ...

  8. Vue实现懒加载的基本思路

    懒加载是前端开发者的基本功之一.实现懒加载肯定是要直接操作DOM的,这个没得跑,但我们可以想办法让流程尽可能优雅些. 基本结构 父组件是列表容器,子组件是列表中的项,如卡片.帖子等,承载图片的DOM对 ...

  9. python模块的导入的两种方式区别详解

    Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...

  10. eclipse中如何自动生成构造函数

    eclipse中如何自动生成构造函数 eclipse是一个非常好的IDE,我在写java程序的时候使用eclipse感觉开发效率很高.而且有很多的快捷和简便方式供大家使用,并且能直接生成class文件 ...