Go语言学习21-包文件与init函数
关于包文件,更多的是概念性的,操作上会比较简单,使用地多了,就熟能生巧了,理论性大概读几遍即可,不要浪费太多时间在包管理这里!
包的概念很简单,就好像我们新建go文件的文件夹一样。在其他语言也有涉及,例如世界上最好的语言PHP中的文件包含。
那么为什么要有包文件?
1、我们不可能把所有的函数都放在同一个源文件中,可以分门别类的把函数放在不同的源文件中
将定义工具类操作的函数放入utils.go
这个文件中,将对数据库操作的函数放入db.go
文件中。main.go
调用这两个文件中的函数时,需要导入对应的文件中的函数。
2、解决同名问题:
程序员有时候要用到几个功能差不多的函数,为了见名知意,起的名字基本上都是一样的。所以这种重名的函数是很常见的。
案例
首先要明确一点,我们之前配置的GOPATH,到底是干什么的(再次复习)
将新建的Go目录,配成GOPATH
这样调用的时候,就可以直接调过去了。
目录结构
main.go
package main // 1、package是进行包的声明,建议声明的包与所在文件夹同名
//main包是程序的入口包,一般main函数会放在这个包下
import (
"fmt"
"study/studygo/day07/package/demo01/project_test/dbutils"
)
func main() {
fmt.Println("这是main包中的main函数执行") //println()也是可以的
dbutils.DbConnect() //想要调用函数,必须导入包,并定位到之前所在的包
}
Dbutils.go
package dbutils
import "fmt"
func DbConnect() { //注意,如果这是要被调用,需要首字母大写,不然无法导入
fmt.Println("这是dbutils包下的dbConnect函数执行")
}
可见性
1、包中的标识符(变量名/函数名/结构体/接口等)如果首字母是小写的,表示私有(只能在当前这个包中使用)
2、首字母大写的标识符,对外部的包可见,可被调用
3、正如fmt.Println
,Println
永远第一个是大写字母,就是因为调用fmt
包中的Println
包文件别名
import (
nihao "Study_GO/studygo/day15/calc"
"fmt"
)
func main() {
ret := nihao.Add(10, 20)
fmt.Println("ret:", ret)
}
匿名导入包
如果引入一个包的时候为其设置了一个特殊_
作为包名,那么这个包的引入方式就称为匿名引入。一个包被匿名引入的目的主要是为了加载这个包,从而使得这个包中的资源得以初始化。 被匿名引入的包中的init
函数将被执行并且仅执行一遍。导入这个包没有引入任何的方法
import _ "github.com/go-sql-driver/mysql"
匿名引入的包与其他方式导入的包一样都会被编译到可执行文件中。
需要注意的是,Go语言中不允许引入包却不在代码中使用这个包的内容,如果引入了未使用的包则会触发编译错误。
包的注意事项以及弊端
注意事项
1、package进行包的声明,建议:包的声明这个包和所在的文件夹名字一致
2、main包是程序的入口包,一般main函数会放在这个包下。否则不能编译执行。
3、打包语法:package 包名
4、引入包语法:import "包的路径"。包的路径是从$GOPATH/src/后开始计算的,使用/进行路径分割。(插件与功能配置可以实现)
5、如果有多个包,建议一次性导入(插件与功能配置可以实现)
import (
"fmt"
"gocode/testproject01/unit5/demo09/crm/dbutils" //一定要注意gocode前没有 /
)
6、在函数调用的时候前面要定位到所在的包
7、首字母大写,函数可以被其它包访问
8、一个目录下不能有重复的函数
9、包名和文件夹的名字,可以不一样
10、一个目录下的同级文件归属一个包,即同目录下的源文件的包的声明必须一致!
11、包到底是什么:
- 在程序层面,所有使用相同 package包名的源文件组成的代码模块
- 在源文件层面就是一个文件夹
12、可以给包取一个别名,但是原来的包名就不能用了
13、Go语言禁止循环导入包,什么意思?就是A导入B,B导入C,C导入D,D导入A。这就是一个环,禁止!
弊端
1、每次引入,都只能在src
目录下引入,会比较麻烦。假设别人用了另一个版本的go,一旦修改,你如何引入以及使用呢?
2、你每次都要在Github上下载别人的库,然后再引用么?那不就很麻烦了。
3、到后面,会学习一种方式,即go mod
,一种新的包管理方式,会更加方便快捷。
init函数
还记得之前学的init函数吧,这里算是复习一遍
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类