入坑Go语言(二)—— 包机制的理解 - Go语言中文社区

入坑Go语言(二)—— 包机制的理解


golang

原文发布在我的个人博客 入坑Go语言(二) | 以太空间

一、概述

  想学习Golang,包肯定是绕不过去的,就像C语言的标准库,这篇文章里,我将为大家介绍关于Go语言包机制的使用、注意事项和原理

二、package

package遵循以下原则:
1. package是最基本的分发单位和工程管理中依赖关系的体现
2. 每个Go语言源代码文件开头都必须要有一个package声明,表示源代码文件所属包
3. 要生成Go语言可执行程序,必须要有名为mainpackage包,且在该包下必须有且只有一个main函数
4. 同一个路径下只能存在一个package,一个package可以由多个源代码文件组成

  按照我个人的理解,一个目录就是一个包,该目录下的所有文件必须属于同一个包。

  再来看看多文件的Package

// File: main.go
package main

import "fmt"

func learn() {
    fmt.Println("I am learning.")
}

func main() {
    fmt.Println("----main start ----")
    learn()
    eat()
    fmt.Println("----main end ----")
}
// File: eat.go
package main

import "fmt"

func eat() {
    fmt.Println("I am eating.")
}

  在命令行编译一下,然后执行

$ go build . # 会在当前目录生成名为`go`的执行文件
$ ./go

结果输出

----main start ----
I am learning.
I am eating.
----main end ----

三、import

1. 作用与写法

  import语句的唯一作用就是导入源码文件所依赖的包,而且导入的包必须在源码文件里用到,否则会报错(在VS Code里如果输入一个没有导入的包函数,VS Code会自动导入)

  import的写法有两种格式,我个人更倾向于第二种

import "package1"
import "package2"
import "package3"

improt (
    "package1",
    "package2",
    "package3"
)

2. 原理

  跟package类似,import原理遵守以下几个原则:

  1. 如果一个main导入其他的包,包会被顺序导入
  2. 如果导入的包(pkg1)依赖其他的包(包pkg2),会首先导入pkg2,然后初始化pkg2中的常量与变量,如果pkg2中有init函数,会自动执行init
  3. 所有包导入完成后才会对main的常量和变量进行初始化,然后执行main中的init函数(如果有的话),最后执行main函数
  4. 如果一个包被导入多次实际上只会导入一次

关于上面第三条规的import多重依赖的流程如下图所示

go_import

3. import别名

import iii "fmt"
// 此处省略一些代码...
iii.Println("hello")

  如果别名是.的话,则可以这样调用(一般不建议这样使用)

import . "fmt"
// 此处省略一些代码...
Println("hello")

  有一个最特别的情况,如果别名是_的话,表示只注册该包(初始化全局常量和变量,且执行其init函数),并不会实际引入该包

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_24013171/article/details/80298871
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 21:22:18
  • 阅读 ( 1490 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢

扫一扫下方二维码,关注本站官方公众号
获取永久解锁本站全部文章的验证码
还能不定期领现金红包