Go语言学习21-包文件与init函数

关于包文件,更多的是概念性的,操作上会比较简单,使用地多了,就熟能生巧了,理论性大概读几遍即可,不要浪费太多时间在包管理这里!

包的概念很简单,就好像我们新建go文件的文件夹一样。在其他语言也有涉及,例如世界上最好的语言PHP中的文件包含。

那么为什么要有包文件?

1、我们不可能把所有的函数都放在同一个源文件中,可以分门别类的把函数放在不同的源文件中

将定义工具类操作的函数放入utils.go这个文件中,将对数据库操作的函数放入db.go文件中。main.go调用这两个文件中的函数时,需要导入对应的文件中的函数。

image-20220215165007813

2、解决同名问题

程序员有时候要用到几个功能差不多的函数,为了见名知意,起的名字基本上都是一样的。所以这种重名的函数是很常见的。

image-20220215165216673

案例

首先要明确一点,我们之前配置的GOPATH,到底是干什么的(再次复习)

image-20220215205805686

将新建的Go目录,配成GOPATH

image-20220215210052824

这样调用的时候,就可以直接调过去了。

image-20220215210424614

目录结构

image-20220215214110509

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.PrintlnPrintln永远第一个是大写字母,就是因为调用fmt包中的Println

image-20220302104303594

包文件别名

import (
	nihao "Study_GO/studygo/day15/calc"
	"fmt"
)

func main() {
	ret := nihao.Add(10, 20)
	fmt.Println("ret:", ret)
}

image-20220302105133422

匿名导入包

如果引入一个包的时候为其设置了一个特殊_作为包名,那么这个包的引入方式就称为匿名引入。一个包被匿名引入的目的主要是为了加载这个包,从而使得这个包中的资源得以初始化。 被匿名引入的包中的init函数将被执行并且仅执行一遍。导入这个包没有引入任何的方法

import _ "github.com/go-sql-driver/mysql"

匿名引入的包与其他方式导入的包一样都会被编译到可执行文件中。

需要注意的是,Go语言中不允许引入包却不在代码中使用这个包的内容,如果引入了未使用的包则会触发编译错误。

包的注意事项以及弊端

注意事项

1、package进行包的声明,建议:包的声明这个包和所在的文件夹名字一致

2、main包是程序的入口包,一般main函数会放在这个包下。否则不能编译执行。

image-20220215215256852

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函数吧,这里算是复习一遍

image-20220302112709432

image-20220302113016512

多个init函数执行顺序

image-20220302113054569

posted @ 2022-03-02 11:43  sukusec不觉水流  阅读(16)  评论(0编辑  收藏  举报