Go语言import导入包——在代码中使用其他的代码
来源:云海天教程
时间:2023-01-08 21:14:09 443浏览 收藏
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go语言import导入包——在代码中使用其他的代码》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下package,希望所有认真读完的童鞋们,都有实质性的提高。
可以在一个 Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入路径。要引用其他包的标识符,可以使用 import 关键字,导入的包名使用双引号包围,包名是从 GOPATH 开始计算的路径,使用/
进行路径分隔。默认导入的写法
导入有两种基本格式,即单行导入和多行导入,两种导入方法的导入代码效果是一致的。1) 单行导入
单行导入格式如下:import "包1"
import "包2"
2) 多行导入
当多行导入时,包名在 import 中的顺序不影响导入效果,格式如下:import(
"包1"
"包2"
…
)
本套教程所有源码下载地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ 提取密码:hfyf代码 8-1 的目录层次如下:
.
└── src
└── chapter08
└── importadd
├── main.go
└── mylib
└── add.go
代码8-1 加函数(具体文件:…/chapter08/importadd/mylib/add.go)
package mylibfunc Add(a, b int) int { return a + b}第 3 行中的 Add() 函数以大写 A 开头,表示将 Add() 函数导出供包外使用。当首字母小写时,为包内使用,包外无法引用到。
add.go 在 mylib 文件夹下,习惯上将文件夹的命名与包名一致,命名为 mylib 包。
代码8-2 导入包(具体文件:…/chapter08/importadd/main.go)
package mainimport ( "chapter08/importadd/mylib" "fmt")func main() { fmt.Println(mylib.Add(1, 2))}代码说明如下:第 4 行,导入 chapter08/importadd/mylib 包。第 9 行,使用 mylib 作为包名,并引用 Add() 函数调用。
在命令行中运行下面代码:
export GOPATH=/home/davy/golangbook/code
go install chapter08/importadd
$GOPATH/bin/importadd
运行代码,输出结果如下:
3
导入的包之间可以通过添加空行来分组;通常将来自不同组织的包独自分组。包的导入顺序无关紧要,但是在每个分组中一般会根据字符串顺序排列。(gofmt 和 goimports 工具都可以将不同分组导入的包独立排序。)
import ( "fmt" "html/template" "os" "golang.org/x/net/html" "golang.org/x/net/ipv4")
导入包后自定义引用的包名
如果我们想同时导入两个有着名字相同的包,例如 math/rand 包和 crypto/rand 包,那么导入声明必须至少为一个同名包指定一个新的包名以避免冲突。这叫做导入包的重命名。import ( "crypto/rand" mrand "math/rand" // 将名称替换为mrand避免冲突)导入包的重命名只影响当前的源文件。其它的源文件如果导入了相同的包,可以用导入包原本默认的名字或重命名为另一个完全不同的名字。
导入包重命名是一个有用的特性,它不仅仅只是为了解决名字冲突。如果导入的一个包名很笨重,特别是在一些自动生成的代码中,这时候用一个简短名称会更方便。选择用简短名称重命名导入包时候最好统一,以避免包名混乱。选择另一个包名称还可以帮助避免和本地普通变量名产生冲突。例如,如果文件中已经有了一个名为 path 的变量,那么我们可以将"path"标准包重命名为 pathpkg。
每个导入声明语句都明确指定了当前包和被导入包之间的依赖关系。如果遇到包循环导入的情况,Go语言的构建工具将报告错误。
匿名导入包——只导入包但不使用包内类型和数值
如果只希望导入包,而不使用任何包内的结构和类型,也不调用包内的任何函数时,可以使用匿名导入包,格式如下:import ( _ "path/to/package")其中,path/to/package 表示要导入的包名,下画线_
表示匿名导入包。
匿名导入的包与其他方式导入包一样会让导入包编译到可执行文件中,同时,导入包也会触发 init() 函数调用。
包在程序启动前的初始化入口:init
在某些需求的设计上需要在程序启动时统一调用程序引用到的所有包的初始化函数,如果需要通过开发者手动调用这些初始化函数,那么这个过程可能会发生错误或者遗漏。我们希望在被引用的包内部,由包的编写者获得代码启动的通知,在程序启动时做一些自己包内代码的初始化工作。例如,为了提高数学库计算三角函数的执行效率,可以在程序启动时,将三角函数的值提前在内存中建成索引表,外部程序通过查表的方式迅速获得三角函数的值。但是三角函数索引表的初始化函数的调用不希望由每一个外部使用三角函数的开发者调用,如果在三角函数的包内有一个机制可以告诉三角函数包程序何时启动,那么就可以解决初始化的问题。
Go 语言为以上问题提供了一个非常方便的特性:init() 函数。
init() 函数的特性如下:每个源码可以使用 1 个 init() 函数。init() 函数会在程序执行前(main() 函数执行前)被自动调用。调用顺序为 main() 中引用的包,以深度优先顺序初始化。
例如,假设有这样的包引用关系:main→A→B→C,那么这些包的 init() 函数调用顺序为:
C.init→B.init→A.init→main
说明:同一个包中的多个 init() 函数的调用顺序不可预期。init() 函数不能被其他函数调用。理解包导入后的init()函数初始化顺序
Go 语言包会从 main 包开始检查其引用的所有包,每个包也可能包含其他的包。Go 编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码。在运行时,被最后导入的包会最先初始化并调用 init() 函数。
通过下面的代码理解包的初始化顺序。
代码8-3 包导入初始化顺序入口(…/chapter08/pkginit/main.go)
package mainimport "chapter08/code8-2/pkg1"func main() { pkg1.ExecPkg1()}代码说明如下:第 3 行,导入 pkg1 包。第 7 行,调用 pkg1 包的 ExecPkg1() 函数。
代码8-4 包导入初始化顺序pkg1(…/chapter08/pkginit/pkg1/pkg1.go)
package pkg1import ( "chapter08/code8-2/pkg2" "fmt")func ExecPkg1() { fmt.Println("ExecPkg1") pkg2.ExecPkg2()}func init() { fmt.Println("pkg1 init")}代码说明如下:第 4 行,导入 pkg2 包。第 8 行,声明 ExecPkg1() 函数。第 12 行,调用 pkg2 包的 ExecPkg2() 函数。第 15 行,在 pkg1 包初始化时,打印 pkg1 init。
代码8-5 包导入初始化顺序pkg2(…/chapter08/pkginit/pkg2/pkg2.go)
package pkg2import "fmt"func ExecPkg2() { fmt.Println("ExecPkg2")}func init() { fmt.Println("pkg2 init")}代码说明如下:第 5 行,声明 ExecPkg2() 函数。第 10 行,在 pkg2 包初始化时,打印 pkg2 init。
执行代码,输出如下:
pkg2 init
pkg1 init
ExecPkg1
ExecPkg2
好了,本文到此结束,带大家了解了《Go语言import导入包——在代码中使用其他的代码》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!
-
113 收藏
-
500 收藏
-
172 收藏
-
464 收藏
-
105 收藏
-
210 收藏
-
108 收藏
-
367 收藏
-
419 收藏
-
234 收藏
-
155 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 妩媚的流沙
- 这篇文章太及时了,细节满满,很有用,收藏了,关注师傅了!希望师傅能多写Golang相关的文章。
- 2023-05-31 12:53:25
-
- 重要的鸭子
- 好细啊,已加入收藏夹了,感谢作者大大的这篇技术贴,我会继续支持!
- 2023-02-13 15:12:33
-
- 悲凉的人生
- 这篇博文真是及时雨啊,作者加油!
- 2023-02-10 20:33:26
-
- 怡然的小甜瓜
- 这篇技术贴太及时了,太细致了,很有用,码起来,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-02-09 23:37:33
-
- 甜美的墨镜
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享技术贴!
- 2023-01-31 00:34:35
-
- 重要的毛衣
- 细节满满,mark,感谢博主的这篇技术贴,我会继续支持!
- 2023-01-28 19:10:30
-
- 会撒娇的小蜜蜂
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢up主分享博文!
- 2023-01-10 19:23:35