import
import用于导入被引用的包。如在项目中,有一个打印日志信息的包,路径是GOPATH/src/hzwy23/GoDemos/demo5/logs。 包名是logs。在main函数中想使用logs包来记录信息。只需要在发生引用的地方,导入logs这个包即可使用logs包中的可导出的变量,结构体,函数等。
在引用包时,import指向的是包所在的目录相对于GOPATH/src的路径。当包被导入后,在使用包中的函数,变量,结构体时,不是使用目录作为前缀来访问包中变量,函数,机构体等,而是使用这个目录下声明的包名作为前缀来访问。
如GOPATH环境变量指向/opt/workspace目录,这个目录下边结构如下:
bin
pkg
src
---hzwy23
------GoDemos
---------demo5
------------logs
---------------write.go
---------------config.go
---------------logger.go
------------app
---------------main.go
在main函数中引用logs包的方法是:
logger.go文件
package logs
import (
"fmt"
)
func Info(v ...interface{}) {
fmt.Println(v...)
}
main.go文件
package main
import (
"github.com/hzwy23/GoDemos/demo5/logs"
)
func main() {
logs.Info("hello world")
}
import导入的是logs包在GOPATH/src中的路径。在使用包中的函数Info时,使用了logs作为前缀,这里的logs不是目录名,而是目录下golang源文件中使用package关键字声明的包名。如果logs目录下golang源文件中声明的包名为logger,那么在使用logger包时,导入方法不变,但是调用logger包中Info函数时,需要使用logger作为前缀。示例代码如下:
logger.go文件
package logger
import (
"fmt"
)
func Info(v ...interface{}) {
fmt.Println(v...)
}
main.go文件
package main
import (
"github.com/hzwy23/GoDemos/demo5/logs"
)
func main() {
logger.Info("hello world")
}
如果自定义包不在GOPATH/src目录下边,那么还能被引用吗?
答案是:不能, go在编译时,只会查询GOPATH /src下边的包和go sdk自身的包。如果需要引用的包不在GOPATH/src下边,又不是go sdk自身的包,那么就不能被引用。
包的4中引用方式
- 1.常规方法直接导入
- 2.带别名导入
- 3.下划线导入
- 4.带点号导入
1.常规方法直接导入
import (
"github.com/hzwy23/GoDemos/demo5/logs"
)
也可以写成
import "github.com/hzwy23/GoDemos/demo5/logs"
2.带别名导入
带别名导入,就是在导入包之后,给包取一个别名,为什么要取别名? 第一、包名太长,在代码编写过程中农又不想写那么长的包名,可以给引入的包取一个别名,方便编码;第二、引用了多个包名相同的包,如A目录下包名是logs,B目录下包名也是logs,现在有一个地方同时需要使用这两个包,当把这两个包的都导入进来之后,在调用这两个包中的变量,函数,结构体时,显然通过包名去访问,就会产生歧义,于是带别名导入包的方式,就很好的解决了这个问题,只需要给A目录下的logs取别名为lg,这样在调用A目录下的包中函数,变量,结构体时,使用lg作为包名。
package main
import (
lg "github.com/hzwy23/GoDemos/demo5/logs"
)
func main() {
lg.Info("hello world")
}
如上边的代码,lg就是logs包的别名,在编码过程中,直接适用lg来代替包logs。带别名的方式导入bao,这个别名并不是这个包路径的别名,而是这个目录下包的别名,所以一定要记清楚这一点,别名是给包取的
3.下划线导入
带下划线导入包,就是在导入包的路径后,在路径前边加上一个下划线,如下所示
package main
import (
_ "github.com/hzwy23/GoDemos/demo5/logs"
)
func main() {
logs.Info("hello world")
}
如果带下划线导入包,那么导入包中的变量,结构体,函数能被调用嘛?答案是:不能。 如上边的代码,编译时会提示错误信息:
.\main.go:8:2: undefined: logs
带下划线导入包,而又不能使用这个包中的变量,函数,结构体,那么导入的目的是什么呢?这个go语言的一个特殊之处,与init函数有关。后边会重点讲解init函数。在这里,需要牢记一点:带下划线导入,会执行被导入包里边所有的init函数。这样做的好处是什么呢?通常用于服务注册,变量初始化等等。
4.带点号导入
带点号导入包,就是在导入包所在目录路径的时候,在路径前边加上点号,如下所示:
package main
import (
. "github.com/hzwy23/GoDemos/demo5/logs"
)
func main() {
Info("hello world")
}
带点号导入,这样做的好处是,在调用导入包中的函数时,不需要写包名。如Info是logs包中的函数,当logs被带点号导入后,在调用logs中的Info函数时,不需要带上包名logs。