用 package 关键字定义一个包。文件名不需要与包名一致。包名的约定是使用小写字符。

1
2
3
4
5
6
7
package even
func Even(i int ) bool {
return i % 2 == 0
}
func odd(i int ) bool {
return i % 2 == 1
}

名称以大写字母起始的是可导出的,可以在包的外部调用。

如果想要让上面 go 可以被其他 go 引入的话,需要创建这个包,然后在 $PATH 下创建一个目录,复制 even.go 到这个目录。

1
2
3
4
$ mkdir $GOPATH/src/even
$ cp even.go $GOPATH/src/even
$ go build
$ go install

可以如下在其他文件当中使用这个包:

1
2
3
4
5
6
7
8
9
package main
import (
"even"
"fmt"
)
func main() {
i := 5
fmt.Printf("Is %d even? %v\n", i, even.Even(i))
}
1
2
3
$ go build myeven.go
$ ./myeven
Is 5 even? false

概括来说:

  • 公有函数的名字以大写字母开头
  • 私有函数的名字以小写字母开头

标识符

包名是小写的一个单词;不应当有下划线或混合大小写。

包名是导入的默认名称。可以通过在导入语句指定其他名称来覆盖默认名称:

1
import bar "bytes"

包文档

1
2
3
4
/*
写包文档
*/
package even

测试包

go test 程序调用了所有的测试函数。

测试文件也在包目录中, 被命名为 *_test.go。每个测试函数都有相同的标识,它的名字以 Test 开头:

1
func TestXxx(t *testing.T)

在 testing 包中包含了内部的一些方法:

1
2
3
4
func (t *T) Fail() // Fail 标记测试函数失败,但仍然继续执行。
func (t *T) FailNow() // FailNow 标记测试函数失败,并且中断其执行。
func (t *T) Log(args ... interface { }) // Log 用默认格式对其参数进行格式化
func (t *T) Fatal(args ... interface { }) // Fatal 等价于Log() 后跟随 FailNow()
1
2
3
4
5
6
7
8
package even
import "testing"
func TestEven(t *testing.T) {
if ! Even(2) {
t.Log("2 should be even!")
t.Fail()
}
}

第一行使用了 package even,测试使用与被测试的包使用相同的名字空间。

常用的包

  • fmt:包 fmt 实现了格式化的 I/O 函数,这与 C 的 printf 和 scanf 类似。
  • io:这个包提供了原始的 I/O 操作界面。
  • bufio:这个包实现了缓冲的I/O。
  • sort:sort 包提供了对数组和用户定义集合的原始的排序功能。
  • strconv:strconv 包提供了将字符串转换成基本数据类型,或者从基本数据类型转换为字符串的功能。
  • encoding/json:encoding/json 包实现了编码与解码。
  • html/template:数据驱动的模板,用于生成文本输出,例如HTML。
  • net/http:net/http 实现了 HTTP 请求、响应和 URL 的解析,并且提供了可扩展的 HTTP 服务和基本的 HTTP 客户端。
  • reflect:reflect 包实现了运行时反射,允许程序通过抽象类型操作对象。

【课后练习】

go-leran

—EOF—