golang外部包与自定义包的导入问题

5,310 阅读2分钟

习惯使用Java开发的朋友,在切换到go语言上总会有些不适应。不管使用何种语言开发,包这个概念都会存在,即便没有包,也总有文件夹吧。如果没有包管理代码,所有代码文件都放在一个目录下,一个小的项目上百个代码文件,一个大项目几千个代码文件,如何快速的找到某个功能在哪个文件是件非常头疼的问题。在web项目开发中,通常我们会按mvc分层,每个层一个包名,除此之外,如果文件多的情况下,我们可能还会按业务分包。

使用Go语言开发,导入开源的包非常简单,无需编写依赖配置文件,只需要一条go get xxx命令将依赖的包下载下来,在代码中使用import导入即可使用,非常简单。但如果依赖的包太多,首次下载项目需要一个个包去执行go get命令也是很蛋疼的,不过依然有各种插件可解决这些问题。

对于初学Go,特别是JavaGo的朋友来说,可能遇到最多的问题就是,在一个项目内,定义的包,如何在其它地方导入使用。这通常是由于没有理解Go的环境变量配置所导致的。

以mac系统为例,go的环境变量配置如下,配置文件~/.bash_profile

#GOROOT,用pkg安装无需配置
export GOROOT=/usr/local/go
#GOPATH
export GOPATH="/Users/wjy/go:/Users/wjy/MyProjects/golang_projects"
# GOBIN
#export PATH=$PATH:/Users/wjy/go/bin
  • GOROOT: go的安装路径,如果是下载pkg安装的,那么GOROOT就是/usr/local/go
  • GOPATH:可以理解为java的classpath,即go语言项目代码的路径,这个路径是可以配置多个的,使用分割。
  • GOBIN: go install编译存放路径。不允许设置多个路径,可以为空。为空时则遵循“约定优于配置”原则,可执行文件放在各自GOPATH目录的bin文件夹中。go install后的文件直接是一个可执行文件,存放在GOBIN配置bin路径下,可以在shell中直接执行该文件。

go buildgo install的不同: *go build 不能生成包文件, go install可以生成包文件 *go build 生成可执行文件在当前目录下, go install生成可执行文件在bin目录下($GOPATH/bin

只要GOPATH配置正确,导包就不会有问题。go的项目路径要求是这样的

GOPATH
|--bin (go install命令编译后的可执行文件存放目录)
|--src
    |__项目A(github.wujiuye.blog)
         |--app.go(main.go,当前路径下执行go build与go install命令编译项目)
         |--model(一些结构体的定义)
         |--service(service层)
         |--controller
         |--dao
         |--common(一些组件类)
    |__项目B

你也可以一个GOPATH下面只放一个项目,但你需要频繁的去修改环境变量。而GOPATH目录下的src是必须的,用于存放项目代码。GOPATH下一共有三个目录,分别是srcbinpkgbing目录存放go install编译后的可执行文件。

GOPATH配置了多个路径后,使用go get xxxx会将外部包下载到第一个路径下,所以不要把项目代码的GOPATH写在前面。

以上面例子中的‘项目A’为例,假设model包下有一个user.go,在service中需要使用,那么只需要在service中添加import 项目A/model导入model包即可,使用model包下的结构体、方法、接口等,都需要加上包名。如

package service

import github.wujiuye.blog/model

func UserTest(){
    var user model.User = &model.User{}
}

使用go get xxx导入外部包可能会遇到下面这个问题,最简单的解决办法就是翻墙。

package golang.org/x/sys/unix: unrecognized import path "golang.org/x/sys/unix" 
(https fetch: Get https://golang.org/x/sys/unix?go-get=1: 
dial tcp 216.239.37.1:443: i/o timeout)