1、Go语言使用包(package)这种语法元素来组织源码
myblog
├── conf
│ └── app.conf
├── controllers
│ ├── aboutme_controller.go
│ ├── add_article_controller.go
│ ├── album_controller.go
│ ├── base_controller.go
│ ├── default.go
│ ├── delete_article_controller.go
│ ├── exit_controller.go
│ ├── home_controller.go
│ ├── login_controller.go
│ ├── register_controller.go
│ ├── show_article_controller.go
│ ├── tags_controller.go
│ ├── update_article_controller.go
│ └── upload_controller.go
├── main.go
├── models
│ ├── album_model.go
│ ├── article_model.go
│ ├── home_model.go
│ ├── tags_model.go
│ └── user_model.go
├── myblogweb
├── routers
│ └── router.go
├── static
│ ├── css
│ │ ├── blogsheet.css
│ │ └── lib
│ │ ├── highlight.css
│ │ └── login.css
│ ├── img
│ ├── js
│ │ ├── blog.js
│ │ ├── lib
│ │ │ ├── jquery-3.3.1.min.js
│ │ │ └── jquery.url.js
│ │ └── reload.min.js
│ └── upload
│ └── img
│ └── 2018
│ └── 12
│ └── 11
│ ├── 1544511378-bee2.png
├── tests
│ └── default_test.go
├── utils
│ ├── myUtils.go
│ └── mysqlUtils.go
└── views
├── aboultme.html
├── album.html
├── block
│ ├── home_block.html
│ └── nav.html
├── home.html
├── index.tpl
├── login.html
├── register.html
├── show_article.html
├── tags.html
└── write_article.html
Go 语言的源码复用建立在包(package)基础之上。包通过 package, import, GOPATH 操作完成。
同一个目录下的所有.go文件的第一行添加 包定义,以标记该文件归属的包:
package 包名
包需要满足:
-
一个目录下的同级文件归属一个包。也就是说,在同一个包下面的所有文件的package名,都是一样的。
-
在同一个包下面的文件
package
-
包名为 main 的包为应用程序的入口包,其他包不能使用。
import
// 文件:d://test/tool.go中
package haijin
// 可以被导出的函数
func FuncPublic() {
}
// 不可以被导出的函数
func funcPrivate() {
}
要引用其他包,可以使用 import 关键字,可以单个导入或者批量导入,语法演示:
A:通常导入
// 单个导入
import "package"
// 批量导入
import (
"package1"
"package2"
)
import(
. "fmt"
)
用的fmt.Println("hello world")
可以省略的写成Println("hello world")
C:起别名
别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字。导入时,可以为包定义别名,语法演示:
import (
p1 "package1"
p2 "package2"
)
// 使用时:别名操作,调用包函数时前缀变成了我们的前缀
p1.Method()
D:_操作
这个操作经常是让很多人费解的一个操作符,请看下面这个import:
import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)
导入的包的路径名,可以是相对路径也可以是绝对路径,推荐使用绝对路径(起始于工程根目录)。
import导入时,会从GO的安装目录(也就是GOROOT环境变量设置的目录)和GOPATH环境变量设置的目录中,检索 src/package 来导入包。如果不存在,则导入失败。 GOROOT,就是GO内置的包所在的位置。 GOPATH,就是我们自己定义的包的位置。
通常我们在开发Go项目时,调试或者编译构建时,需要设置GOPATH指向我们的项目目录,目录中的src目录中的包就可以被导入了。
在Go 1.16及以后的版本中,不再需要显式设置GOPATH。Go模块化已成为推荐的包管理方式,可以直接使用现代化的项目结构,无需依赖于GOPATH。
在Go模块化中,你可以在任何目录中初始化一个新的模块,不需要将项目放在GOPATH的特定目录下。Go模块将自动下载和管理你的包依赖关系,并将它们存储在项目的vendor目录中。
所以,从Go 1.16开始,你不再需要设置GOPATH,除非你在使用旧版本的Go或与旧版兼容的项目。如果你使用的是新版本的Go,强烈建议使用Go模块化来管理你的项目。
src/userPackage/tool.go
package userPackage
import "fmt"
func init() {
fmt.Println("tool init")
}
主函数源码:
src/main.go
package main
import (
"userPackage"
)
func main() {
fmt.Println("main run")
// 使用userPackage
userPackage.SomeFunc()
}
执行时,会先输出 "tool init",再输出 "main run"。
下面我们详细的来介绍一下init()、main() 这两个函数。在 go 语言中的区别如下:
相同点:
两个函数在定义时不能有任何的参数和返回值。 该函数只能由 go 程序自动调用,不可以被引用。
不同点:
init 可以应用于任意包中,且可以重复定义多个。 main 函数只能用于 main 包中,且只能定义一个。
两个函数的执行顺序:
在 main 包中的 go 文件默认总是会被执行。
对同一个 go 文件的 init( ) 调用顺序是从上到下的。
对同一个 package 中的不同文件,将文件名按字符串进行“从小到大”排序,之后顺序调用各文件中的init()函数。
对于不同的 package,如果不相互依赖的话,按照 main 包中 import 的顺序调用其包中的 init() 函数。
如果 package 存在依赖,调用顺序为最后被依赖的最先被初始化,例如:导入顺序 main –> A –> B –> C,则初始化顺序为 C –> B –> A –> main,一次执行对应的 init 方法。main 包总是被最后一个初始化,因为它总是依赖别的包
避免出现循环 import,例如:A –> B –> C –> A。
一个包被其它多个包 import,但只能被初始化一次
go允许import不同代码库的代码。对于import要导入的外部的包,可以使用 go get 命令取下来放到GOPATH对应的目录中去。
举个例子,比如说我们想通过go语言连接mysql数据库,那么需要先下载mysql的数据包,打开终端并输入以下命令:
go get github.com/go-sql-driver/mysql
安装之后,就可以在gopath目录的src下,看到对应的文件包目录:(go.mod)
也就是说,对于go语言来讲,其实并不关心你的代码是内部还是外部的,总之都在GOPATH里,任何import包的路径都是从GOPATH开始的;唯一的区别,就是内部依赖的包是开发者自己写的,外部依赖的包是go get下来的。
7、补充
我们可以通过go install 来编译包文件。
我们知道一个非main包在编译后会生成一个.a文件(在临时目录下生成,除非使用go install安装到$GOROOT或$GOPATH下,否则你看不到.a),用于后续可执行程序链接使用。
比如Go标准库中的包对应的源码部分路径在:$GOROOT/src,而标准库中包编译后的.a文件路径在$GOROOT/pkg/darwin_amd64下。
$GOPATH/pkg/$GOOS_$GOARCH
2024-06-18 start:
go语言如何快速引入所有的第三方包?
在 Go 语言中,如果你想要一次性引入项目中所有所需的第三方包,通常的做法是通过 Go Modules 来管理依赖。以下是基本步骤:
-
确保 Go Modules 已启用: 首先,确保你的环境已经启用了 Go Modules。你可以在命令行中运行以下命令来开启它(如果尚未开启):
Sh1、go env -w GO111MODULE=on
-
初始化 Go Module: 如果你的项目还没有
go.mod
文件,需要在项目根目录下运行以下命令来初始化 Go Module:Sh1、go mod init <module-name>
其中
<module-name>
是你的模块名称,通常为项目导入路径。 -
安装依赖: 接下来,你需要安装项目中已经列出的所有依赖。如果你的代码中已经直接或间接通过
import
语句指定了依赖,可以通过以下命令自动下载和更新这些依赖:Sh1、go mod tidy
这个命令会添加缺失的模块和对应的版本到
go.mod
文件,并从go.sum
文件中移除未使用的模块。 -
构建或运行项目: 当你使用
go build
或go run
命令构建或运行你的项目时,Go 会自动处理依赖关系,确保所有需要的包都已正确下载和链接。
通过上述步骤,Go 会自动处理项目中所有第三方包的引入和管理,无需手动一个个导入。确保你的代码中正确使用了 import
语句来引用所需的包,Go Modules 会基于这些引用自动处理依赖。
end