Go 语言基础(四) 之 包

1、包是函数和数据的集合。用 package 保留字定义一个包。文件名不需要与包名 一致。

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

让我们在文件 even.go 中定义一个叫做 even 的包。

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 ← 构建它

% go install ← 将其安装到 ~../pkg

接下来在程序 myeven.go 中使用这个包:

package main

import( // 导入下面的包;

"even" // 本地包 even 在这里导入;

"fmt" // 调用 even 包中的函数。

)

func main(){

i := 5

//访问一个包中的函数的语法是 <package>.Function ()。

fmt.Printf("Is%deven?%v\n",i,even.Even(i))

}

% go build myeven.go

% ./myeven

Is 5 even? false

在 Go 中,当函数的首字母大写的时候,函数会被从包中导出(在包外部可见,或者说公有的),

因此函数名是 Even。如果修改 myeven.go 的第even.Even,

使用未导出的函数 even.odd:

fmt.Printf("Is %d even? %v\n", i, even.odd(i))

由于使用了私有的函数,会得到一个编译错误:

myeven.go:10: cannot refer to unexported name even.odd

概括来说:

? 公有函数的名字以大写字母开头;

? 私有函数的名字以小写字母开头。

这个规则同样适用于定义在包中的其他名字(新类型、全局变量)。

注意,“大 写” 的含义并不仅限于 US ASCII,它被扩展到了整个 Unicode 范围。

所以大写的 希腊语、古埃及语都是可以的。

2、包名

包名是好的、短的、简洁的、好记的。

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

由于每个人都可能需要录入这个名字,所以尽可能的简短。不要提前考虑冲突

包名是导入的默认名称,可以给包重命名eg,

import bar "bytes" // 重命名为 bar

另一个规则是包名就是代码的根目录名;在 src/pkg/compress/gzip 的包,

作为 compress/gzip 导入,但名字是 gzip,不是 compress_gzip 也不是 compressGzip。

3、测试包

在 Go 中为包编写单元测试应当是一种习惯。编写测试需要包含 testing 包和

程序 go test。两者都有良好的文档。

4、常用的包

标准的 Go 代码库中包含了大量的包,并且在安装 Go 的时候多数会伴随一起安装。

浏览 $GOROOT/src/pkg 目录并且查看那些包会非常有启发。

无法对每个包就加以解说,不过下面的这些值得讨论:

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 [5] 定义的 JSON 对象。

text/template

数据驱动的模板,用于生成文本输出,例如 HTML。

将模板关联到某个数据结构上进行解析。模板内容指向数据结构的元素 (通常结构的字段或者 map 的键)控制解析并且决定某个值会被显示。模

板扫描结构以便解析,而 “游标” @ 决定了当前位置在结构中的值。

net/http

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

unsafe

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

reflect

reflect 包实现了运行时反射,允许程序通过抽象类型操作对象。

通常用于处理静态类型 interface{} 的值,并且通过 Typeof 解析出其动态类型信息,

通常会返回一个有接口类型 Type 的对象。

os/exec

os/exec 包执行外部命令。

时间: 2024-10-21 01:56:21

Go 语言基础(四) 之 包的相关文章

Object Pascal 语法之语言基础(四)

1.8 过程与函数 过程与函数是实现一定功能的语句块,是程序中的特定功能单元.可以在程序的其他地方被调用,也可以进行递归调用.过程与函数的区别在于过程没有返回值,而函数有返回值. 1.过程与函数的定义过程与函数的定义包括过程原型或函数原型.过程体或函数体的定义.过程定义的形式如下: procedure ProcedureName(ParameterList); directives; var LocalDeclarations; begin statements end; ProcedureNa

Go语言基础之time包

时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法. time包 time包提供了时间的显示和测量用的函数.日历的计算采用的是公历. 时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func timeDemo() { now := time.Now() //获取当前时间 fmt.Printf("current time:%v\n", now) yea

Go语言基础之包

Go语言基础之包 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的.本文介绍了Go语言中如何定义包.如何导出包的内容及如何导入其他包. Go语言的包(package) 包介绍 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt.os.io等. 定义包 我们还可以根据自己的需要创建自己的包.一个包可以简单理解为一个存放.go文件的文件夹. 该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该

第五天:语言基础(四)

Java 中的运算符 一门编程语言,最常坐的工作就是数据运算.在 Java 中,有丰富的运算符来进行数值运算.这些运算符可以分为以下几类: 算数运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其它运算符 算数运算符 先来说说算数运算符. 操作符 描述 说明 + 加--运算符两侧的值进行相加 注意类型转换 - 减--左操作数减去右操作数 注意类型转换 * 乘--运算符两侧的值进行相乘 注意类型转换 / 除--左操作数除以右操作数 注意左右操作数类型的不同,结果的类型也不同 % 取余--左操作

Lua语言基础汇总(11) -- Lua中的模块与包

前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命名空间,其内容就是模块中导出的所有东西,比如函数和常量,一个符合规范的模块还应使require返回这个table.现在就来具体的总结一下require和module这两个函数. require函

区块链基础语言(四)——Go语言工程管理

一.工作区‍ 在<Go语言开发环境搭建>中已经讲述了GOPATH的设置.GOPATH就是自定义的工作区目录,该目录包含3个子目录: src目录 存放源代码(比如以.go..c..h..s结尾的源代码文件) pkg目录 存放编译后生成的文件,即由go install命令构建安装后的代码包(包含Go库源码文件)的“.a”归档文件 bin目录 存放编译后生成的可执行文件,即通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件. 加到GOPATH,但此时需要用分隔符分隔.Wi

03 java语言基础逻辑运算符

03.01_Java语言基础(逻辑运算符的基本用法)(掌握) A:逻辑运算符有哪些 &,|,^,! &&,|| B:案例演示 逻辑运算符的基本用法 注意事项: a:逻辑运算符一般用于连接boolean类型的表达式或者值. b:表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子. 算术表达式:a + b 比较表达式:a == b(条件表达式) C:结论: &逻辑与:有false则false. |逻辑或:有true则true. ^逻辑异或:相同为false,不同

Java基础-lesson2-java语言基础

一.   不同包中的文件调用 说明:创建三个Java文件,PackageDemo.java Dog.java   Cat.java PackageDemo.java  Dog.java 在oreg.westos.java.lesson1包中 Cat.java 在oreg.westos.java.lesson2  包中: 用PackageDemo.java 调用Dog.java   Cat.java 1.  创建文件   package org.westos.java.lesson1;      

Java学习总结(二)----Java语言基础

1.     Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,int, long ,float,double,char,boolean,void 用于定义数据类型值的关键字 true,false,null 用于定义流程控制的关键字 If,else,switch,case,default, while,do,for,break,continue,return 用于

Go学习笔记(2) 语言基础和数值布尔类型

  1. Go语言环境变量 Go语言开发环境依赖一些操作系统环境变量,常用的环境变量如下: $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方. $GOARCH 表示目标机器的处理器架构,它的值可以是 386,amd64 或 arm. $GOOS 表示目标机器的操作系统,它的值可以是 darwin,freebsd,linux 或 windows $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,如果你使用的