Go学习笔记三(包)

包是函数和数据的集合。用 package 关键字定义一个包。文件名不需要与包名一致。包名的约定是使用小写字符。Go 包可以由多个文件组成,但是使用相同的package <name> 这一行。让我们在文件 even.go 中定义一个叫做 even 的包。

创建一个包

• 公有函数的名字以 大写 字母开头;
• 私有函数的名字以 小写 字母开头。
根据规则,包名是小写的一个单词;不应当有下划线或混合大小写。
包别名

import bar "bytes"
package even //← 开始自定义的包
//名称以大写字母起始的是 可导出 的,可以在包的外部调用
func Even(i int) bool{ //← 可导出函数(公有函数)
    return  i % 2 == 0
}

func odd(i int) bool { //← 私有函数
    return i % 2 == 1
}

在 $GOPATH 下建立一个目录,复制 even.go 到这个目录

 mkdir $GOPATH/src/even
 cp even.go $GOPATH/src/even
 go build  //在$GOPATH/src/even目录执行
 go install //在$GOPATH/src/even目录执行

现在就可以在程序 myeven.go 中使用这个包:

package main
//导入下面的包;
import(
    "even" //本地 包 even 在这里导入;
    "fmt"  //官方 fmt 包导入;
)

func main() {
    i:=4
    //调用 even 包中的函数。访问一个包中的函数的语法是 < package >.Function() 。
    fmt.Printf("is %d even ? %v\n",i,even.Even(i))
    //fmt.Printf("is %d even ? %v\n",i,even.odd(i)) //报错,访问私有函数

}

测试包

测试文件也在包目录中,被命名为
*_test.go 。这些测试文件同 Go 程序中的其他文件一样,但是 go test 只会执行测试函数。每个测试函数都有相同的标识,它的名字以 Test 开头:

func TestXxx(t *testing.T)

编写测试时,需要告诉 go test 测试是失败还是成功。测试成功则直接返回。当测试失败可以用下面的函数标记

//Fail 标记测试函数失败,但仍然继续执行。
func (t *T) Fail()
// FailNow 标记测试函数失败,并且中断其执行。当前文件中的其余的测试将被跳过,
// 然后执行下一个文件中的测试。
func (t *T) FailNow()
// Log 用默认格式对其参数进行格式化,与 Print() 类似,并且记录文本到错误日志。
func (t *T) Log(args ... interface {} )
// Fatal 等价于 Log() 后跟随 FailNow() 。
func (t *T) Fatal(args ... interface {} )

even 包的测试。命名为 even_test.go

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

import "testing" //导入 testing 包

func TestEven(t *testing.T) { //测试函数
    if !Even(2){
    // if Even(2){ //失败

        t.Log("2 should be even")
        t.Fail()
    }
}

测试

go test

这里写图片描述

常用的包介绍

fmt

包 fmt 实现了格式化的 I/O 函数,这与 C 的 printf 和 scanf 类似。格式化短语派生于 C 。一些短语(%-序列)这样使用:

%v //默认格式的值。当打印结构时,加号(%+v)会增加字段名;

%#v //Go 样式的值表达;

%T //带有类型的 Go 样式的值表达;

io

这个包提供了原始的 I/O 操作界面。它主要的任务是对 os 包这样的原始的 I/O 进行封装,增加一些其他相关,使其具有抽象功能用在公共的接口上。

bufio

这个包实现了缓冲的 I/O。它封装于 io.Reader 和 io.Writer 对象,创建了另
一个对象(Reader 和 Writer)在提供缓冲的同时实现了一些文本 I/O 的功能。

sort

sort 包提供了对数组和用户定义集合的原始的排序功能。

strconv

strconv 包提供了将字符串转换成基本数据类型,或者从基本数据类型转换为字符串的功能。

os

os 包提供了与平台无关的操作系统功能接口。其设计是 Unix 形式的

sync

sync 包提供了基本的同步原语,例如互斥锁。

flag

flag 包实现了命令行解析。

encoding/json

encoding/json 包实现了编码与解码 RFC 4627定义的 JSON 对象

html/template

数据驱动的模板,用于生成文本输出,例如 HTML。
将模板关联到某个数据结构上进行解析。模板内容指向数据结构的元素(通常结构的字段或者 map 的键)控制解析并且决定某个值会被显示。模板扫描结构以便解析,而 “游标” @ 决定了当前位置在结构中的值。

net/http

net/http 实现了 HTTP 请求、响应和 URL 的解析,并且提供了可扩展的 HTTP 服务和基本的 HTTP 客户端。

unsafe

unsafe 包包含了 Go 程序中数据类型上所有不安全的操作。 通常无须使用这个。

reflect

reflect 包实现了运行时反射,允许程序通过抽象类型操作对象。通常用于处理静态类型 interface{} 的值,并且通过 Typeof 解析出其动态类型信息,通常会返回一个有接口类型 Type 的对象。

os/exec

os/exec 包执行外部命令。

练习

// 创建一个固定大小保存整数的栈。它无须超出限制的增长。定义 push 函数——
// 将数据放入栈,和 pop 函数——从栈中取得内容。栈应当是后进先出(LIFO)的
//1、为 stack 的实现创建一个合适的包, Push 、 Pop 和 Stack 类型需要被导出。
//2、为这个包编写一个单元测试,至少测试 Push 后 Pop 的工作情况。

创建包stack.go

//stack.go存放在 ~src/stack
package stack 
// 保存元素的 Stack
type Stack struct{
    i int 
    data [10]int
}

//将元素压入栈中
func (s *Stack)Push(k int) {
    s.data[s.i] = k
    s.i++
}
//从栈中弹出一个元素
func (s *Stack)Pop()(ret int) {
    s.i--
    ret = s.data[s.i]
    return 
}

创建测试包stack_test.go

//stack_test.go 存放在 ~src/stack
package stack

import "testing"

func TestPushPop(t *testing.T) {
    c := new(Stack)
    c.Push(5)
    if c.Pop()!=5 {
        t.Log("Pop doesnot give 5")
        t.Fail()
    }
}

安装和测试包
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值