前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言学习(七)| 包

Go语言学习(七)| 包

作者头像
Mervyn
发布2020-07-21 14:54:13
4020
发布2020-07-21 14:54:13
举报

包的定义

包是函数和数据的集合。用 package 保留字定义一个包。例:

package main

文件名不需要与包名一致。包名的约定是使用小写字符。Go 包可以由多个文件组成,但是使用相同的 package <name> 这一行。

包的函数命名方式:

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

标识符如果已小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的

main包

package main 表示一个可独立执行的程序。每个 Go 应用程序都包含一个名为 main 的包。

包中的 init 函数

init 函数是包的一个特殊的函数,每个含有该函数的包都会首先执行这个包。

init 调用顺序

  1. 对同一个 go 文件的 init() 调用顺序是从上到下的
  2. 对同一个 package 中不同文件是按文件名字符串比较 “从小到大” 顺序调用各文件中的 init() 函数
  3. 对于对不同的 package ,如果不相互依赖的话,按照 main 包中 **先import的后调用** 的顺序调用其包中的 init()
  4. 如果 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? %v\n", 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发技术那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 包的定义
  • main包
  • 包中的 init 函数
  • 导入包
    • 相对路径导入
      • 绝对路径导入
        • 点操作
          • 别名操作
            • _ 操作
            • 自定义包
              • 自定义包 (以 even 包为例)
                • 使用定义的 even 包
                  • 包测试
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档