可跳转至 Caius的个人网站 阅读
一 ,基本语法
import(
"fmt"
)
//然后在代码里面可以通过如下的方式调用
fmt.Println("hello world")
上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块:
//相对路径
import "./test_model" //当前文件同一目录的test_model目录,但是不建议这种方式import
//绝对路径
import "mygoproject/test_model" //加载GOPATH/src/mygoproject/test_model模块
点操作
import . "fmt"
这个点操作的含义就是这个包导入之后在调用这个包的函数时,可以省略前缀的包名
fmt.Println("hello world")
//可以省略的写成
Println("hello world")
别名操作
别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字
import( f "fmt" )
//别名操作调用包函数时前缀变成了重命名的前缀,即
f.Println("hello world")
_ 操作
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
//_ 操作其实只是引入该包。当导入一个包时,它所有的init()函数就会被执行,但有些时候并非真的需要使用这些包,仅仅是希望它的init()函数被执 行而已。
// 这个时候就可以使用_操作引用该包了。即使用_操作引用包是无法通过包名来调用包中的导出函数,而是只是为了简单的调用其init函数()。
二,模块路径导入
随着 Go Modules 的引入,Go 项目越来越倾向于使用模块来管理依赖关系。在一个使用 Go Modules 的项目中,通过写入相对路径,Go 编译器会尝试在 GOPATH 中寻找包,但这样的做法在模块化的环境下不再推荐。
下面分两种情况来理一下吧,一种情况是在同一个项目中的两个包,另一中情况是不在同一个项目的两个包
同一个项目中的两个包
目录结构如下,我们要在moduledemo/main.go
中调用了mypackage
这个包
moduledemo
├── go.mod
├── main.go
└── mypackage
└── mypackage.go
moduledemo/go.mod
中按如下定义:
module moduledemo
go 1.20
然后在moduledemo/main.go
中按如下方式导入mypackage
package main
import (
"fmt"
"moduledemo/mypackage" // 导入同一项目下的mypackage包
)
func main() {
mypackage.New()
fmt.Println("main")
}
不在同一个项目的两个包
目录结构如下:
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go
mypackage/go.mod
:
module mypackage
go 1.20
在moduledemo/main.go
中按如下方式导入:
import (
"fmt"
"mypackage"
)
func main() {
mypackage.New()
fmt.Println("main")
}
因为这两个包不在同一个项目路径下,想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod
文件中使用replace
指令。
在调用方也就是moduledemo/go.mod
中按如下方式指定使用相对路径来寻找mypackage
这个包。
module moduledemo
go 1.20
require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"
三,重点来了
3.1 import 后跟的是 路径 而不是 包名
每个包是由一个全局唯一的字符串所标识的导入路径定位。出现在import语句中的导入路径也是字符串。
import后面的最后一个元素应该是路径,就是目录,并非包名
包名和目录名没有关系,但是包名最好等于目录名
比如:
import m "lib/math"
m.Sin
: m指代的是lib/math路径下唯一的那个包
同一个目录下只能有一种包名
3.2 导入包的重命名
如果我们想同时导入两个有着名字相同的包,例如math/rand包和crypto/rand包,那么导入声明必须至少为一个同名包指定一个新的包名以避免冲突。这叫做导入包的重命名。
import (
"crypto/rand"
mrand "math/rand" // alternative name mrand avoids conflict
)