golang import 理解

包的理解

Golang中有package的概念。在go源码文件的第一行就是先声明包名:

1
package xxx

这里的包名相当于一个标签,不是字符串。和所在文件夹没有关系,比如:上述源码在GOPATH/golang-learning/chapter06/文件夹下,它的包名就是xxx

导入包

用improt关键字导入包,包的导入路径是基于工作目录的。因此Go会在工作目录src子目录下查找包

  • 导入标准包使用的是给定的短路径,如“fmt”、“net/http”

    $GOPATH/src/learning/chapter01/hello.go

    1
    2
    3
    4
    5
    6
    7
    package hello

    import "fmt"

    func SayHello() {
    fmt.Println("Hello,World!");
    }
  • 项目的包,需要在工作目录下指定一个目录

    $GOPATH/src/learning/cmd/main.go

    1
    2
    3
    4
    5
    6
    7
    package main

    import "learning/chapter01"

    func main() {
    hello.SayHello()
    }

    **注意:**同一个路径下不支持定义多个包,会报编译错误

导入包的方式

导入使用包有四种方式,不同方式用途不一样

  1. import “learning/chapter01”
    常规方式,通过包名hello调用SayHello方法。hello.SayHello()

  2. import h “learning/chapter01”
    这里的 h 是包名 hello 的别名,h.SyayHello() 。该方式合适的场景

    • 包名过于复杂或者意思不明确
      我写的代码其实就很不明确,所以最好要起别名来明确含义
      1
      import hello "learning/chapter01"
    • 包名和其他包冲突
      随着项目代码的不断增加或引入第三方包,很大概率大家会用相同的包名,就需要用别名来区别
      1
      2
      3
      4
      import (
      "errors"
      bizError "learning/chapter11"
      )
  3. import . “learning/chapter01”
    这里的点”.”符号表示,对包 hello 的调用直接省略包名,你我以后就是一家人,不分彼此,你的东西就像我就的一样,随便用。

    1
    2
    3
    4
    5
    6
    7
       package main

    import . "learning/chapter01"

    func main() {
    SayHello()
    }
  4. improt _ “learning/chapter01”
    当导入一个包时,该包下的文件里所有init()函数都会被执行,我们就需要用“_”符合来导入包

    1
    2
    3
    4
    5
    6
    package main

    import _ "learning/chapter01"

    func main() {
    }

参考

  1. 理解Go import