一、package
参考文章:
知乎:go语言 包(package)详解
go语言的包(package)是多个Go源码的集合,go语言有很多内置包,比如fmt,os,io等。我们也可以自定义包。在一个go语言程序中使用其它包的对象或者函数时,首先要通过 import 引入它。
该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该文件归属的包。
package 包名
注意事项:
- 一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能在多个文件夹下。
- 包名可以不和文件夹的名字一样,包名不能包含 - 符号。
- 包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件。
参考:
go语言学习 package
1.1 引入包的路径
- 第一种方式相对路径:
import "./module" // 引入的包在当前文件同一目录的 module 目录
- 第二种方式绝对路径:
import "LearnGo/init" // 引入的包在 gopath/src/LearnGo/init 目录。
1.2 引入包的特殊方式
下面展示一些特殊的 import 方式。
- 点操作
这个点操作的含义就是这个包导入之后,在调用这个包的函数时,可以省略前缀的包名。
import . "fmt"
// 例如:fmt.Println("hello world") 可以省略的写成 Println("hello world")。
- 别名操作
别名操作就是可以把包命名成另一个容易记忆的名字。
import f "fmt"
// 别名操作的话调用包函数时前缀变成了我们的前缀,即 f.Println("hello world")。
- _ 操作
_操作是一个让很多人费解的操作符,例如:
import _ "github.com/go-sql-driver/mysql"
// _操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。
go get XXXX
二、多package使用
参考文章:
go语言多package使用实战
测试下go多page包调用时是如何实现的
2.1 同一目录下使用
- 不用import,直接调用函数
- 多个文件中,只能有一个文件有main()函数
mysql.go文件
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:Qaz123456!@tcp(106.12.242.175:3306)/dtspgtest?charset=utf8")
if err != nil {
fmt.Println(err)
}
// 确保db正常关闭
defer db.Close()
// 使用前Ping, 确保db连接正常
err = db.Ping()
if err != nil {
fmt.Println(err)
}
// 创建
create()
}
test.go文件
package main
import (
"database/sql" //sql.Open加载包
_ "github.com/go-sql-driver/mysql" //没用到包里的内容但是需要加载一下这个包.
"log"
)
func create() {
db, err := sql.Open("mysql", "root:Qaz123456!@tcp(106.12.242.175:3306)/gotest") //声明数据库类型为mysql 使用用户名,密码,连接形式,链接地址和端口,指定数据库
if err != nil {
log.Fatal(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
log.Fatal(err)
}
log.Println("数据库连接成功")
//定义一个创建数据库表的变量,后续进行exec的调用.
createTable := "CREATE TABLE `gousertest` (`uid` int(10) NOT NULL AUTO_INCREMENT,`username` varchar(64) NOT NULL DEFAULT '1', `gender` tinyint(1) DEFAULT NULL,`password` varchar(64) DEFAULT NULL,`created` date DEFAULT NULL,PRIMARY KEY (`uid`)) ;"
_, err = db.Exec(createTable)
if err != nil {
log.Fatal(err)
}
log.Println("数据库创建成功")
}
两个文件都属于同一个main包,直接编译即可
2.2 同一目录多个包时
参考文章1:
一个例子明白go 的package
参考文章2:
如何使用go module导入本地包
实战
main()文件运行,使用go.mod所在的文件路径开始import,函数中要使用import的内容,不然会被删除掉
同目录下面的test.go文件有相同的package的名字,同目录别的文件调用的时候,直接使用create()函数,不用import
不同目录调用的时候,需要import;import之后,直接使用函数即可