Go包-代码组织者

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

内容简介: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包-代码组织者

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

查看所有标签

猜你喜欢:

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

Concepts, Techniques, and Models of Computer Programming

Concepts, Techniques, and Models of Computer Programming

Peter Van Roy、Seif Haridi / The MIT Press / 2004-2-20 / USD 78.00

This innovative text presents computer programming as a unified discipline in a way that is both practical and scientifically sound. The book focuses on techniques of lasting value and explains them p......一起来看看 《Concepts, Techniques, and Models of Computer Programming》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具