Go语言学习(七)| 包
包的定义
包是函数和数据的集合。用 package
保留字定义一个包。例:
package main
文件名不需要与包名一致。包名的约定是使用小写字符。Go 包可以由多个文件组成,但是使用相同的 package <name>
这一行。
包的函数命名方式:
- 公有函数的名字以大写字母开头;
- 私有函数的名字以小写字幕开头。
标识符如果已小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的
main包
package main
表示一个可独立执行的程序。每个 Go 应用程序都包含一个名为 main
的包。
包中的 init 函数
init
函数是包的一个特殊的函数,每个含有该函数的包都会首先执行这个包。
init 调用顺序
- 对同一个 go 文件的
init()
调用顺序是从上到下的 - 对同一个
package
中不同文件是按文件名字符串比较 “从小到大” 顺序调用各文件中的init()
函数 - 对于对不同的
package
,如果不相互依赖的话,按照main
包中**先import的后调用**
的顺序调用其包中的init()
- 如果
package
存在依赖,则先调用最早被依赖的package
中的init()
,然后调用main
函数
导入包
包的导入通过使用 import
来实现。import 导入包有如下几种操作方式
相对路径导入
例:
import "./model" //当前文件同一目录的model目录,但是不建议这种方式来 import
绝对路径导入
import "shorturl/model" //加载gopath/src/shorturl/model模块
点操作
package main
import . "fmt"
func main() {
dd := 101
Printf("%d", dd) //因为上面用的点操作导入的包,所以现在就不需要前面加包名,即 fmt.Printf()
}
别名操作
package main
import f "fmt"
func main() {
dd := 101
f.Printf("%d", dd) //因为上面将fmt包起了个别名f,用fmt.Printf()就会报错
}
_
操作
package main
import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)
_
操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init
函数
自定义包
以定义一个even包为例:
自定义包 (以 even 包为例)
文件: even.go
package even //开始自定义的包
func Even(i int) bool { // 可导出函数(函数名首字母大写)
return i%2 == 0
}
func odd(i int) bool { // 私有函数(函数名首字母小写)
return i%2 == 1
}
cd ~
vi .bashrc //在最后加入 export GOPATH=$HOME/go 保存退出 GOPATH 的路径可自己定义
source .bashrc //使刚配置的GOPATH生效
mkdir -p $GOPATH/src/even
将上述的 even.go 文件放入 $GOPATH/src/even
注意:文件夹 even 的名字要和 even.go 文件中 package <name>
中 name 的名字相同。 even.go 文件名可以随意
使用定义的 even 包
文件: myeven.go
package main
import (
"even"
"fmt"
)
func main() {
i := 5
fmt.Printf("Is %d even? %vn", i, even.Even(i))
}
输出结果:Is 5 even? false
包测试
在包放置的目录下(如 $GOPATH/src/even
)建立一个 *_test.go
文件
func (t *T) Fail()
Fail 标记测试函数失败,但仍然继续执行。
func (t *T) FailNow()
FailNow 标记测试函数失败,并且中断其执行。这将会执行下一个测试。因此,当前文件的其他所有测试都被跳过。
func (t *T) Log(args ...interface{})
Log 用默认格式对其参数进行格式化,与Print() 类似,并且记录文本到错误日志。
func (t *T) Fatal(args ...interface{})
Fatal 等价于Log() 后跟随FailNow()。
将这些凑到一起,就可以编写测试了。首先,选择名字even_test.go。然后添加下面的内容:
package even
import "testing"
func TestEven(t *testing.T) {
if !Even(2) {
t.Log("2 should be even!")
t.Fail()
}
}
注意在第一行使用了 package even,测试使用与被测试的包使用相同的名字空间在包目录中执行 go test 即可
ok even 0.001s
- JavaFX——(第一篇:介绍篇)
- 自编码器是什么?有什么用?这里有一份入门指南(附代码)
- UWP基础教程 - {x:DeferLoadStrategy}
- UWP基础教程 - 重启应用
- html5打开摄像头
- UWP基础教程 - App多语言支持
- Golang实现Fibonacii的几种算法
- 【译】使用 dotnet watch 开发 ASP.NET Core 应用
- vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)
- Golang语言切片slice的线程协程安全问题
- ASP.NET Core 在 Azure 开启 HTTPS
- 算法基础:最大递减数问题(Golang实现)
- 亲身经历的痛--database/sql: Stmt的使用以及坑
- Ubuntu上通过nginx部署Django笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何实现oVirt与Tungsten Fabric的集成
- 一文让你学完C++,干货收藏!!!
- 缓冲区溢出
- 指针变量的传值和传址
- 又被限速,我决定用 Serverless 搭建一款私人网盘
- C语言与C++常见面试题
- delete 和 delete [] 的真正区别
- C语言最大难点揭秘:编程的祸根!
- 【漏洞修复】MongoDB未授权访问漏洞复现和修复
- 在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像
- 实现Android 滑动退出Activity的功能
- Android开发中播放声音的两种方法分析
- Android UI设计与开发之实现应用程序只启动一次引导界面
- Android编程实现两点触控功能示例
- Android RecycleView添加head配置封装的实例