Go包-代码组织者

栏目: Go · 发布时间: 5年前

内容简介:Go语言中的包,其实是一种组织代码的方式。Go 的程序都会组织成若干组文件,而每组文件被称为一个包。go安装完成之后,在结尾的测试文件,忽略)使用关键字--

Go语言中的包,其实是一种组织代码的方式。Go 的程序都会组织成若干组文件,而每组文件被称为一个包。go安装完成之后,在 GOROOT/src 目录,自带了各种各样的包,例如常用的 io 包、 fmt 包、 math 包等。我们就来分析下 io 包,看看 go 内置的包是如何组织代码的。

Go包-代码组织者
上图显示的就是 io 包的目录结构,分别打开 io.gomulti.gopipe.go ,你会发现在文件非注释的第一行都声明了 package io 。没错,这三个源文件都属于同一个go包-- io 包。到这里,其实已经很明白了,所谓的go包就是计算机中的目录,通俗点讲就是文件名。go语言就是这样通过它们进行目录结构和文件组织的。在 io 包目录下,其实还有个 ioutil 包,感兴趣的同学可以打开 ioutil 目录下的文件,一探究竟。(以 _test.go

结尾的测试文件,忽略)

包应该如何命名

使用关键字-- package和go文件所在目录同名 ,这是go包命名的最大原则,其次还应该做到 简洁清晰全小写 。这种命名方式有利于开发时书写包名,查找和定位。例如,上面提到的 io 包、 ioutil 包,命名都很简短且清晰。所属 io 包的三个文件,在文件开头都声明了 package io

包的导入

使用关键字-- import 。使用一个包,必须先将包导入(不管是go内置包还是自己写的包)。例如:

// 导入单个包
import "fmt"
复制代码
// 使用go语言提供的导入快,导入多个包,每个包独占一行
import (
	"fmt"
	"io/ioutil"
	"github.com/Seekload/stringutil"
)
复制代码

import 告诉编译器到磁盘的哪里去找想要导入的包。其实,上面导入 fmtio/ioutilgithub.com/Seekload/stringutil 是一个相对路径,编译器会使用 Go 环境变量( GOROOTGOPATH )设置的路径,通过引入的相对路径来查找磁盘上的包。例如 io/ioutil ,编译器最终会在 GOROOT/src/io/ioutil 路径下查找到 ioutil 包。类似的,会在 GOPATH/src/github.com/Seekload/stringutil 路径下查找到 stringutil 包。 提一点 :编译器在查找的时候,会优先在 GOROOT 路径下查找,其次,在 GOPATH 下查找,查找无果之后会报编译错误。 导入包完成之后,就可以使用包提供的常量、函数等 ,例如:

fmt.Println();
ioutil.ReadDir();
复制代码

获取远程包

某一天,你在浏览 github ,发现一个函数丰富的包,想在自己的项目上使用,目前,你想到的引用办法可能就是直接将包 clone 到本地,然后放到 GOPATH/src/ 目录,开始引用。其实,有一种更简便的方式,就是 远程导入 --使用 go get 命令。这种导入的前提就是,包托管在一个分布式的版本控制系统上,比如Github等,并且是Public的权限。 我在GitHub上就有一个 github.com/Seekload/stringutil 包(使用自己的域名作为包名一部分是为了避免包名重复,GitHub上的包太多了~),大家可以跟着我实操一下: 大家看下,我的工作空间目前是这样的,

Go包-代码组织者
GOPATH 执行 go get github.com/Seekload/stringutil

导入远程包之后:

Go包-代码组织者
可以看到 stringutil 包已经下载到工作空间,并且已经生成静态库文件 stringutil.a ,说明对包已进行过编译和安装。 注意go get 工具可以递归获取依赖包,如果 github.com/Seekload/stringutil 也引用了其他的远程包,也可以一并下载下来。 好了,现在就可以在 hello.go

中导入包了

package main

import (
	"fmt"
	"github.com/Seekload/stringutil"
)

func main() {
	fmt.Println(stringutil.Reverse("!oG ,daolkeeS"))
}
复制代码

执行编译安装 go install hello/ ,生成可执行文件 hello

Go包-代码组织者

命名导入

import 支持多个包导入,如果导入的包出现重名,该怎么办?别担心,Go开发团队已经考虑到这个问题了,提供给我们的方法就是,对导入的包重新命名--即命名导入:在 import 语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。看代码:

package main

import (
	"fmt"
	myfmt "github.com/Seekload/stringutil/fmt"
)

func main() {
	fmt.Println()
	myfmt.Println()
}
复制代码

如果,代码里导入了一个没有用到的包,Go编译器不会告警,而是直接编译失败,并抛出一个错误。Go 开发团队认为,导入的包应该被使用。不然,无用的包过多,会使代码变得臃肿且管理繁琐。不过,有时,我们需要导入一个包,但是又用不到,怎么办?没关系,Go提供了空白标识符 _ 来重命名这个包导入。

package main

import (
	"fmt"
	_ "github.com/Seekload/stringutil/fmt"
)
复制代码

这里提到了下划线字符 _ ,以后还会接触到。

下划线字符 _ 称为空白标识符,作用:抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。

关于Go包就讲解到这里。

大家可以扫码关注公众号「Golang来了」,获取更多精彩文章!

Go包-代码组织者

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Software Engineering for Internet Applications

Software Engineering for Internet Applications

Eve Andersson、Philip Greenspun、Andrew Grumet / The MIT Press / 2006-03-06 / USD 35.00

After completing this self-contained course on server-based Internet applications software, students who start with only the knowledge of how to write and debug a computer program will have learned ho......一起来看看 《Software Engineering for Internet Applications》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具