GOROOT、GOPATH和project目录说明

go env环境查看

用go env 可查看当前go环境变量。

$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/mac/MyCodeBase/Go-project/master"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/dg/1_zsnh6n2md7y5kpjj318fk00000gp/T/go-build668952288=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
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"

GOROOT

GOROOT就是go的安装路径
在~/.bash_profile中添加下面语句:

GOROOT="/usr/local/go"
export GOROOT

当然, 要执行go命令和go工具, 就要配置go的可执行文件的路径:
操作如下:
在~/.bash_profile中配置如下:
export $PATH:$GOROOT/bin

GOPATH

        o install/go get和 go的工具等会用到GOPATH环境变量.
        GOPATH是作为编译后二进制的存放目的地和import包时的搜索路径 (其实也是你的工作目录, 你可以在src下创建你自己的go源文件, 然后开始工作)。
            GOPATH之下主要包含三个目录: bin、pkg、src
            bin目录主要存放可执行文件; pkg目录存放编译好的库文件, 主要是*.a文件; src目录下主要存放go的源文件
        不要把GOPATH设置成go的安装路径,
        可以自己在用户目录下面创建一个目录, 如gopath
        操作如下:

        cd ~
        mkdir gopath

        在~/.bash_profile中添加如下语句:
        GOPATH=/Users/username/gopath
        GOPATH可以是一个目录列表, go get下载的第三方库, 一般都会下载到列表的第一个目录里面
        需要把GOPATH中的可执行目录也配置到环境变量中, 否则你自行下载的第三方go工具就无法使用了, 操作如下:
        在~/bash_profile中配置,

        export $PATH:$GOPATH/bin

        创建一个go项目, 并且编译运行:

        mkdir goproject
        cd goproject
        touch hello.go

        在hello.go中输入:

        package main
        import "fmt"
        func main() {
           fmt.Println("Hello, GO !")
        }

        在项目根目录下执行go build命令来构建你的项目, 构建后会生成hello文件
        运行生成的文件./hello, terminal中输出: Hello, GO !
        当然你也可以直接运行命令go run hello.go来执行程序.

如果要上述设置生效, 可以执行命令: source ~/.bash_profile, 上述所有操作均为mac系统下的操作, 如果是非mac系统, 请自行变通.

当存在多个路径时,好像优先采用第一个路径。这个无关紧要了,只有需要的第三方包(库)都能正确下载和使用就ok了。

GOBIN

go install编译存放路径。不允许设置多个路径。可以为空。为空时则遵循“约定优于配置”原则,可执行文件放在各自GOPATH目录的bin文件夹中(前提是:package main的main函数文件不能直接放到GOPATH的src下面。

GOPATH目录结构

goWorkSpace  // (goWorkSpace为GOPATH目录)
  -- bin  // golang编译可执行文件存放路径,可自动生成。
  -- pkg  // golang编译的.a中间文件存放路径,可自动生成。
  -- src  // 源码路径。按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。

go目录结构1:

project1 // (project1添加到GOPATH目录了)
  -- bin
  -- pkg
  -- src
     -- models       // package
     -- controllers  // package
     -- main.go      // package main[注意,本文所有main.go均指包main的入口函数main所在文件]

 project2 // (project2添加到GOPATH目录了)
      -- bin
      -- pkg
      -- src
         -- models       // package
         -- controllers  // package
         -- main.go      // package main

package main文件直接在GOPATH目录到src下。

使用go build可以在src文件夹下编译生成名为“src”的可执行文件。这是golang默认约定。一般我个人不怎么用这个命令。因为它会生成可执行文件在src目录下面。

我一般用:go get 和 go install。

go get [main.go所在路径]

参数 [main.go所在路径]:可选。相对GOPATH/src路径。 缺省是.(src自己)。可指定src下面的子文件夹路径。
go get会做2件事:1. 从远程下载需要用到的包。2.执行go install。(从这里也可以看出golang处处为了简洁而遵循的“约定优于配置”原则)

go install [main.go所在路径]

参数 [main.go所在路径]:可选。 相对GOPATH/src路径。缺省是.(即当前所在目录或工作目录)。可指定src下面的子文件夹。
go
install编译生成名称为[main.go父文件夹名]的可执行文件,放到GOBIN路径下。当GOBIN为空时,默认约定是:生成的可执行文件放到GOPATH/bin文件夹中。产生的中间文件(.a)放在project/pkg中(没有变化时,不重新生成.a)。

我们再看此go目录结构1,执行go install(以及go get的第二阶段go install)会报错:

注意:如果不用额外方式改变环境变量(公司目前用的是sh脚本编译),是编译不过的。报错:can’t load package: package .: no buildable Go source files in *

解决方法1:
曾经我也因为这个错误感到迷惑,认为所有都环境变量都没有问题。网上也没怎么看到直接明确都解答。看了一些帖子后,触类旁通,设置了GOBIN环境变量后解决。(好吧,我至今也没有完整读过英文官方文档。这种默认约定,官方文档上应该有。)

此解决方法有个弊端,多个project会导致多个GOPATH目录。多个project下的目录结构和包一致的话,直接编译会导致编译问题。因为go优先使用第一个GOPATH目录,导致编译冲突。(当然,你也可以每次手工或脚步修改GOPATH环境变量,感觉很麻烦。)不建议多个project直接设置到茫茫多的GOPATH中。当然有解决方法2,我认为是标准合理的解决方法,就是下面go目录结构2了。

go目录结构2:

goWorkSpace     // goWorkSpace为GOPATH目录
  -- bin
     -- myApp1  // 编译生成
     -- myApp2  // 编译生成
     -- myApp3  // 编译生成
  -- pkg
  -- src
     -- common 1
     -- common 2
     -- common utils ...
     -- myApp1     // project1
        -- models
        -- controllers
        -- others
        -- main.go
     -- myApp2     // project2
        -- models
        -- controllers
        -- others
        -- main.go
     -- myApp3     // project3
        -- models
        -- controllers
        -- others
        -- main.go 

一个solution里面的多个project或工具组件都并列放在GOPATH的src下,如myApp1,myApp2,myApp3,common utils。
这时,GOBIN可以为空,编译时,可以如下:
go install myApp1 或 go get myApp1
go install myApp2 或 go get myApp2
go install myApp3 或 go get myApp3

这时才是大家都认为的,把可执行程序myApp1、myApp2、myApp3生成在goWorkSpace/bin下面。多个GOPATH也就有了上面的“把每个GOPATH下的bin都加入到PATH中”。

提示:相同结构的project下同名包怎么办?

有同事在初学时,习惯按照go目录结构1,了解到go目录结构2后(以为仅仅是把main放到了子文件夹,其他controllers等包结构不变),有这样的疑惑。他们原来就有这样的问题,同时把go目录加入到GOPATH后,编译就出现问题,因为包名和路径相同(相对GOPATH下的src),go只会优先查找第一个符合的GOPATH)。只会每次编译时手工修改GOPATH,或写脚本编译。(我看着就觉得累,还徒增脚本维护烦恼。)

解决方案就是:除了通用的,公有的工具、组件外,属于各个project自己的东西,统统随着main.go一起移到project目录下。go目录结构2就是这样的。
导入各个project下的controllers方法:import myApp1/controllers,import
myApp2/controllers这样的。go的import查找的是包的路径,并不是包名。你只用告诉go,你的包都放在哪了,go会从这些路径下查找有没有所需要的包。只是大家一般习惯包名和文件夹名相同,容易误解。只需要注意,一个文件夹下只允许有一个包名,允许有子文件夹定义不同的包。

import 采用的是相对路径写法:路径是 相对GOROOT和GOPATH下的src。

也可以设置GOBIN,而且这时,由于可执行文件名称不同,也不大容易产生覆盖(需要避免的时多个GOPATH用相同的“myApp”project名称。)

具体的还是看个人喜好和实际情况。我个人本地的环境大致是:


  -- my-goWorkSpace    // 主要是为了区分自己的鼓捣的一些东西和工作上的项目
  -- work-goWorkSpace
        -- bin
        -- pkg
        -- src
           -- myApp1
              -- .git
              -- models
              -- controllers
              -- main.go
           -- myApp2
              -- .git
              -- models
              -- controllers
              -- main.go
           -- myApp3
              -- .git
              -- models
              -- controllers
              -- main.go

本地是有多个GOPATH路径的
注意:GOPATH目录和GOPATH下的src不应该添加到源代码管理中,而是各个project目录myApp1、myApp2、myApp3各自时独立的进行源代码管理

我一般不设置GOBIN,把每个GOPATH下的bin都加入到PATH中。

个人理解,有任何问题,欢迎指正。

时间: 2024-08-29 18:00:04

GOROOT、GOPATH和project目录说明的相关文章

初学者没有搞明白的GOROOT,GOPATH,GOBIN,project目录

我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) localhost:~ zhaofan$ go env GOARCH="amd64" GOBIN="" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/

Go语言的GOPATH与工作目录详解

这篇文章主要介绍了Go语言的GOPATH与工作目录详解,本文详细讲解了GOPATH设置.应用目录结构.编译应用等内容,需要的朋友可以参考下 GOPATH设置 go 命令依赖一个重要的环境变量:$GOPATH1 (注:这个不是Go安装目录.下面以笔者的工作目录为说明,请替换自己机器上的工作目录.) 在类似 Unix 环境大概这样设置: 复制代码 代码如下: export GOPATH=/home/apple/mygo 为了方便,应该把新建以上文件夹,并且把以上一行加入到 .bashrc 或者 .z

Android基础学习第一篇—Project目录结构

写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对的地方,希望大家给与指正. 2. 由于类似于读书笔记,可能格式神马的会比较随(hen)意(chou),大家看着受不了,可以使劲吐槽. *************************************我只是分割线***************************************

android Application Project目录结构

src:存放java源文件 gen: 资源配置文件 Android4.0: 4.0 类库 Android Private Lib: 支持库 Android Dependencies: android 的依赖包 Assets: 存放的是大文件 bin:存放.dex文件和打包好的.apk libs:存放的是第三方引用的jar文件 res: 资源文件 drawable-xxxx: 存放的是图片 layout: 布局文件 menu: 设置 values: 常量和主题设置信息 AndroidManifes

令用EclipseJ2EE创建的Dynamic Web project目录结构与用MyEclipse创建的Web project一样

Eclipse for EE 版本, 创建 Dynamic Web Project  会有俩个工程. 其中一个 是你创建的工程, 另外一个 是Servers 工程(其实也就是tomcat 的一个配置) 大概的界面大概是这样. 而相对习惯了MyEclipse 开发的人, 突然切换到Eclipse 可能很不习惯. 其实,Eclipse 和MyEclipse 区别不大的,  只要切换一个视图, 就可以回到熟悉的MyEclipse 的编辑器默认设置 点击菜单的 Window --> show View

【经验总结】- IDEA无法显示Project目录怎么办

1. 关闭IDEA 2.然后删除项目文件夹下的.idea文件夹 3.重新用IDEA工具打开项目 4.再次点击如下图即可搞定 原文地址:https://www.cnblogs.com/gengaixue/p/9153821.html

从0到1简易区块链开发手册V0.3-数据持久化与创世区块

1.BoltDB简介 Bolt是一个纯粹Key/Value模型的程序.该项目的目标是为不需要完整数据库服务器(如Postgres或MySQL)的项目提供一个简单,快速,可靠的数据库. BoltDB只需要将其链接到你的应用程序代码中即可使用BoltDB提供的API来高效的存取数据.而且BoltDB支持完全可序列化的ACID事务,让应用程序可以更简单的处理复杂操作. 其源码地址为:https://github.com/boltdb/bolt 2.BoltDB特性 BoltDB设计源于LMDB,具有以

Go语言GOPATH详解(Go语言工作目录)

GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录. 工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面.计算机及椅子就是你的工作区.工作区的概念与工作目录的概念也是类似的.如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率. GOPATH 适合处理大量 Go语言源码.多个包组合而成的复杂工程. 提示 C.C+

GOROOT与GOPATH

GOROOT:优先搜素GOROOT 然后搜索GOPATH GOPATH: 可以设置多个,当通过go get 从网路获取源码的时候,优先放置到GOPATH的第一个路径之中 在GOROOT GOPATH的路径下有 bin:编译后的可执行文件 src:源码文件 pkg:编译过程中产生的文件 .a GOROOT GOPATH 尽量不要设置为一个路径