Go关键字--import

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.常规方法直接导入

扫描二维码关注公众号,回复: 3161996 查看本文章
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。

猜你喜欢

转载自blog.csdn.net/hzwy23/article/details/79808739
今日推荐