Go中package基本概念

包的概念

写第一个hello.go文件的时候,发现源码的第一行就有

package main

Go 语言的源码复用建立在包(package)基础之上。Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同样以包的方式进行引用。

Go 语言的包与文件夹一一对应,所有与包相关的操作,必须依赖于工作目录(GOPATH)


1、包的基本概念

一般包的名称就是其源文件所在目录的名称

虽然没有强制规定,但是建议这么做!这样结构更清晰

包的导入

import "包的路径"

  • 单行导入
import "fmt"
import "rsc.io/quote"
  • 多行导入
import (
	"fmt"
	"rsc.io/quote"
)

包的引用格式

  1. 标准引用
package main
import "fmt"

func main() {
    fmt.Println("C语言中文网")
}
  1. 自定义别名引用
package main
import F "fmt"

func main() {
    F.Println("C语言中文网")
}
  1. 匿名引用
import _ "fmt"

在引用某个包时,如果只是希望执行包初始化的 init 函数,而不使用包内部的数据时,可以使用匿名引用格式。

  1. 使用标准格式引用包,但是代码中却没有使用包,编译器会报错。
  2. 通过import _ “包的路径” 这种方式引用包,仅执行包的初始化函数,即使包没有 init 初始化函数,也不会引发编译器报错。

包加载过程

在这里插入图片描述

  1. go语言的编译器的包初始化程序会从main函数所在的包开始逐级向下搜索包的引用,直到某一个包没有进行引用为止,最终生成一个包引用的又向无环图
  2. 编译器会将有向无环图转换为树的形式,然后从树的叶子节点开始回溯对单个包进行初始化
  3. 对于单个包,首先对常量进行初始化,然后是全局变量,再次之后才会执行init()函数

关于init()函数和包引用的注意事项

  1. 一个包可能包含多个init()函数,在初始化的时候不能保证init函数的执行顺序,因此建议将逻辑写到一个init()函数中!
  2. 包的引用不允许循环依赖,否则编译器无法生成包引用的有向无环图,会导致编译错误。
  3. 包的引用允许重复依赖,因为编译器会将又向无环图转换成树,这就能保证每个包的init()函数只被执行一次。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值