日期: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. abaqus的umat在vs中debug调试

    配置参考:https://www.jishulink.com/content/post/333909 常见错误:http://blog.sina.com.cn/s/blog_6116bc050100e ...

  2. Unity3D编辑器扩展(四)——扩展自己的组件

    前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...

  3. 微信小程序------加导航

    效果图如下 这个其实很简单 在app.json上面加点代码 "window":{ "backgroundTextStyle":"light" ...

  4. Failed to start end point associated with ProtocolHandler ["http-nio-8080"]

    Spring boot运行项目报错,说明8080端口被占用 此时任务管理器结束javax程序即可.

  5. vue组件通信新姿势

    在vue项目实际开发中我们经常会使用props和emit来进行子父组件的传值通信,父组件向子组件传递数据是通过prop传递的, 子组件传递数据给父组件是通过$emit触发事件来做到的.例如: Vue. ...

  6. swarm集群日常部分操作

    docker swarm: 1)查看集群使用docker info 或 docker node ls 查看集群中的相关信息 2)swarm集群中node的availability状态可以为 activ ...

  7. JAVA线程池的实际运用

    线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池 /** * @param corePoolSize 线程池基本大小,核心线程池大小,活动线程小于corePoolSize ...

  8. ECDSA数字签名算法

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  9. 吴恩达机器学习笔记41-支持向量机的优化目标(Optimization Objective of Support Vector Machines)

  10. Ubuntu下OpenCV版本切换

    1.假如安装了opencv以下两个版本: opencv-2.4.13 opencv-3.2.0 2.安装目录分别为: /usr/local/opencv-2.4.13 /usr/local/openc ...