Go语言学习(七)| 包

mervyn 2018年7月3日12:44:02编程语言 GoGo语言学习(七)| 包已关闭评论163

包的定义

包是函数和数据的集合。
package 保留字定义一个包。例:文章源自编程技术分享-https://mervyn.life/6241fffb.html

package main

文件名不需要与包名一致。包名的约定是使用小写字符。
Go 包可以由多个文件组成,但是使用相同的 package <name> 这一行。文章源自编程技术分享-https://mervyn.life/6241fffb.html

包的函数命名方式:文章源自编程技术分享-https://mervyn.life/6241fffb.html

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

标识符如果已小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的文章源自编程技术分享-https://mervyn.life/6241fffb.html

main包

package main 表示一个可独立执行的程序。
每个 Go 应用程序都包含一个名为 main 的包。文章源自编程技术分享-https://mervyn.life/6241fffb.html

包中的 init 函数

init 函数是包的一个特殊的函数,每个含有该函数的包都会首先执行这个包。文章源自编程技术分享-https://mervyn.life/6241fffb.html

init 调用顺序文章源自编程技术分享-https://mervyn.life/6241fffb.html

  1. 对同一个 go 文件的 init() 调用顺序是从上到下的
  2. 对同一个 package 中不同文件是按文件名字符串比较 “从小到大” 顺序调用各文件中的 init() 函数
  3. 对于对不同的 package ,如果不相互依赖的话,按照 main 包中 **先import的后调用** 的顺序调用其包中的 init()
  4. 如果 package 存在依赖,则先调用最早被依赖的 package 中的 init() ,然后调用 main 函数

导入包

包的导入通过使用 import 来实现。import 导入包有如下几种操作方式文章源自编程技术分享-https://mervyn.life/6241fffb.html

相对路径导入

    例:文章源自编程技术分享-https://mervyn.life/6241fffb.html

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 函数文章源自编程技术分享-https://mervyn.life/6241fffb.html

自定义包

以定义一个even包为例:文章源自编程技术分享-https://mervyn.life/6241fffb.html

自定义包 (以 even 包为例)

文件: even.go文章源自编程技术分享-https://mervyn.life/6241fffb.html

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文章源自编程技术分享-https://mervyn.life/6241fffb.html

注意
文件夹 even 的名字要和 even.go 文件中 package <name> 中 name 的名字相同。 even.go 文件名可以随意文章源自编程技术分享-https://mervyn.life/6241fffb.html

使用定义的 even 包

文件: myeven.go文章源自编程技术分享-https://mervyn.life/6241fffb.html

package main

import (
    "even"
    "fmt"
)

func main() {
    i := 5
    fmt.Printf("Is %d even? %v\n", i, even.Even(i))
}

输出结果:
Is 5 even? false文章源自编程技术分享-https://mervyn.life/6241fffb.html

包测试

在包放置的目录下(如 $GOPATH/src/even )建立一个 *_test.go 文件文章源自编程技术分享-https://mervyn.life/6241fffb.html

func (t *T) Fail()

Fail 标记测试函数失败,但仍然继续执行。文章源自编程技术分享-https://mervyn.life/6241fffb.html

func (t *T) FailNow()

FailNow 标记测试函数失败,并且中断其执行。这将会执行下一个测试。因此,当前文件的其他所有测试都被跳过。文章源自编程技术分享-https://mervyn.life/6241fffb.html

func (t *T) Log(args ...interface{})

Log 用默认格式对其参数进行格式化,与Print() 类似,并且记录文本到错误日志。文章源自编程技术分享-https://mervyn.life/6241fffb.html

func (t *T) Fatal(args ...interface{})

Fatal 等价于Log() 后跟随FailNow()。文章源自编程技术分享-https://mervyn.life/6241fffb.html

将这些凑到一起,就可以编写测试了。首先,选择名字even_test.go。然后添加下面的内容:文章源自编程技术分享-https://mervyn.life/6241fffb.html

package even

import "testing"

func TestEven(t *testing.T) {
    if !Even(2) {
        t.Log("2 should be even!")
        t.Fail()
    }
}

注意在第一行使用了 package even,测试使用与被测试的包使用相同的名字空间
在包目录中执行 go test 即可文章源自编程技术分享-https://mervyn.life/6241fffb.html

ok even 0.001s文章源自编程技术分享-https://mervyn.life/6241fffb.html

weinxin
我的微信公众号
微信扫一扫
mervyn
PHP 将16进制字符转换成汉字 PHP

PHP 将16进制字符转换成汉字

项目代码提供给外部的api,有些参数是中文的。发现有些客户在请求接口的时候,参数的值被转成了16进制,从而导致接口无法正常解析。 此时可以采用如下方法进行转移: <?php $param = &...
Go 方法指针接收者和值接收者 编程语言

Go 方法指针接收者和值接收者

Go 语言可以给自定义的类型添加一个方法。这里的方法其实也是函数,跟函数的区别在于在 func 关键字和函数名中间增加了一个参数,可以认为该类型也作为了参数传递入了函数中,例: package mai...
Go语言学习(十一)| 通道 编程语言

Go语言学习(十一)| 通道

通道类型的值本身就是并发安全的,这也是 Go 语言自带的、唯一一个可以满足并发安全性的类型。 通道声明及初始化 通道相当于一个先进先出的队列。在声明一个通道类型变量的时候,我们首先要确定该通道类型的元...
Go语言学习(十)| module 使用 编程语言

Go语言学习(十)| module 使用

requirement go module 是在go 1.11版本才开始有的,需要将环境变量 GO111MODULE 设置为 on 才能正常使用 例: export GO111MODULE=on 初次...