golang使用总结:GOPATH和GOROOT区别,GOPATH 需要配置多个吗?

此文章待解决的问题:

  1. GOPATH和GOROOT区别?
  2. GOPATH 需要配置多个吗?

问题1:GOPATH和GOROOT区别?

可以简单理解为:

$GOPATH 是go的工程目录

TENCENT64: 14:31 ~/golearn/go_proj > echo $GOPATH
/data/home/user/golearn/go_proj/
TENCENT64: 14:31 ~/golearn/go_proj > cd /data/home/user/golearn/go_proj/
TENCENT64: 14:31 ~/golearn/go_proj > tree -L 1
.
|-- bin
|-- pkg
`-- src

$GOROOT 是go的安装目录

TENCENT64: 14:34 ~/golearn/go_proj > echo $GOROOT
/usr/local/go
TENCENT64: 14:34 ~/golearn/go_proj > cd /usr/local/go
TENCENT64: 14:35 /usr/local/go > tree -L 1
.
|-- api
|-- AUTHORS
|-- bin
|-- blog
|-- CONTRIBUTING.md
|-- CONTRIBUTORS
|-- doc
|-- favicon.ico
|-- lib
|-- LICENSE
|-- misc
|-- PATENTS
|-- pkg
|-- README.md
|-- robots.txt
|-- src
|-- test
`-- VERSION

可执行go env查看go的所有配置信息:

jameszhou@TENCENT64: 14:42 ~/golearn/go_proj/src > go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/data/home/user/golearn/go_proj/"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build189212099=/tmp/go-build"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"

细节备忘:

  • GOPATH使用:

    • 允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候,在Mac和Linux下通过”:”分割;Windows是分号;
    • 当有多个GOPATH时默认将go get获取的包存放在第一个目录下
    • $GOPATH目录约定有三个子目录
      • src:存放源代码(比如:.go .c .h .s等) 按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)
      • pkg:编译时生成的中间文件(比如:.a)  golang编译包时。
      • bin:编译后生成的可执行文件(在项目内执行go install,会把执行文件安装到bin目录)(为了方便,可以把此目录加入到 P A T H 变 量 中 , 如 果 有 多 个 g o p a t h , 那 么 使 用 PATH 变量中,如果有多个gopath,那么使用 PATHgopath使{GOPATH//?/bin:}/bin添加所有的bin目录
  • $GOROOT使用:

  • 在bashrc中配置GOPATH和GOROOT:

export GOPATH=/data/home/user/golearn/go_proj/
export GOROOT=/usr/local/go

问题2:GOPATH 需要配置多个吗?

目前调研,网上大致分为三种流派, 每个流派的使用方式各有利弊。

  • 第一种:全局一个gopath,第三方库和项目源码都放在同一个gopah。采用github管理源码(公司内部采用git.code平台) + glide(go 包管理工具)管理依赖包。
    • 优点:路径只有一个,足够简单,所有项目代码一目了然,阅读方便,采用glide实现版本依赖管理,解决了第三方依赖包升级冲突的问题。
    • 缺点:项目之间的依赖不隔离,容易错误引用到不希望的依赖。 业务代码与第三方依赖包代码在同一个目录,不美观。
  • 第二种:只有两个gopath,第一个gopath存放第三方依赖包, 第二个gopath存放业务项目。 项目依赖管理同样可使用glide解决。
  • 第三种:每个项目有自己专属的gopath。优点是项目在任意目录下都能编译成功,项目之间无任何依赖。 缺点是如今是微服务的潮流,一个大型项目下会拆分成n个子项目,这样会导致gopath内轻轻松松就超过几十个项目路径。 解决办法是在每个项目中起一个build.sh脚本,执行build.sh脚本,先动态设置当前项目目录到gopath,然后才执行go build,这样项目copy到任意目录都能编译通过。

目前组内使用的是第一种和第二种设置方案。

参考资料:

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值