一、GOPATH的概念

GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录(也称为工作区)

工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。

工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,

输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率。

GOPATH 适合处理大量 Go语言源码、多个包组合而成的复杂工程。

从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录,参见下表

可以通过go env命令查看Go的环境变量,我使用的mac效果如下(安装后,更改过)

二、GOPATH的使用

GOPATH目录一般为:

$HOME/go
--bin # 存放编译后的可执行文件
--pkg # 依赖包编译后的*.a文件
--src # 存放源码文件,以代码包为组织形式

如下是一个完整的Go项目的开发目录:

my-go                 // my-go为GOPATH目录
-- bin
-- myApp1 // 编译生成
-- myApp2 // 编译生成
-- myApp3 // 编译生成
-- pkg 依赖包编译后的*.a文件//
-- src
-- MyApp1 // 项目1
-- models
-- controllers
-- others
-- main.go
-- MyApp2 // 项目2
-- models
-- controllers
-- others
-- main.go

设置GOPATH后,工程中使用 import的根目录是GOPATH中的src目录

GOPATH为/Users/lxxxxxk/GolandProjects,工程为/Users/lxxxxxk/Desktop/my-go/src/MyApp1

那么MyApp1中使用import导入本地包的时候,这样写:

import "MyApp1/models"  // models为包名

也就是说,GOPATH下必须要有src目录,不然import导包的时候会找不到

import导包规则:

  1、先去GOROOT/src/路径下找      /usr/local/go/src/MyApp1 (系统环境变量 $GOROOT,即使用go env命令显示的GOROOT)

  2、如果1没有,就去Project GOPATH/src/路径下找     /Users/lxxxxxk/Desktop/my-go/src/MyApp1

  3、如果2还没找到,就去Global GOPATH路径下找     /Users/lxxxxxk/GolandProjects(系统环境变量 $GOPATH,即使用go env命令显示的GOPATH)

三、GoLand设置GOPATH

图中的 Global GOPATH 代表全局 GOPATH,一般来源于系统环境变量中的 GOPATH;

Project GOPATH 代表项目所使用的 GOPATH,该设置会被保存在工作目录的 .idea目录下,不会被设置到环境变量的 GOPATH 中,但会在编译时使用到这个目录。

建议在开发时填写项目 GOPATH,每一个项目尽量只设置一个 GOPATH,不使用多个 GOPATH 和全局的 GOPATH

否则可能会出现如下麻烦:

将某项目代码保存在 /home/davy/projectA 目录下,将该目录设置为 GOPATH。
随着开发进行,需要再次获取一份工程项目的源码,此时源码保存在 /home/davy/projectB 目录下,
如果此时需要编译 projectB 目录的项目,但开发者忘记设置 GOPATH 而直接使用命令行编译,
则当前的 GOPATH 指向的是 /home/davy/projectA 目录,而不是开发者编译时期望的 projectB 目录。
编译完成后,开发者就会将错误的工程版本发布到外网。

Go语言GOPATH是什么的更多相关文章

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

    GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录. 工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面.计算机及椅子就是你的 ...

  2. macos系统下共语言gopath变量的设置

    一.问题 在macos下安装golang开发环境,想更改gopath路径,通过export GOPATH=/Volume/E/go 在vscode中通过go env命令查看GOPATH还是原始默认的, ...

  3. macbook下 go 语言的 helloworld

    go语言开发的目录 一般go语言$GOPATH 目录约定有三个子目录: src 存放源代码(比如:.go .c .h .s等) pkg 编译后生成的文件(比如:.a) bin 编译后生成的可执行文件( ...

  4. 08. Go 语言包(package)

    Go 语言包(package) Go 语言的源码复用建立在包(package)基础之上.Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同 ...

  5. Go第八篇之包的使用

    Go 语言的源码复用建立在包(package)基础之上.Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同样以包的方式进行引用,本章内容将 ...

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

    这篇文章主要介绍了Go语言的GOPATH与工作目录详解,本文详细讲解了GOPATH设置.应用目录结构.编译应用等内容,需要的朋友可以参考下 GOPATH设置 go 命令依赖一个重要的环境变量:$GOP ...

  7. Go语言之讲解GOROOT、GOPATH、GOBIN

    Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. go命令依赖一个重要的环境变量:$GOPATH GOPATH允许多个目录, ...

  8. 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

    到目前位置我们一直在编写单文件代码,只有一个 main.go 文件.本节我们要开始朝完整的项目结构迈进,需要使用 Go 语言的模块管理功能来组织很多的代码文件. 细数 Go 语言的历史发展,模块管理经 ...

  9. go语言-工作区和gopath

    工作区是放置Go源码文件的目录;一般情况下,Go源码文件都需要存放到工作区中;但是对于命令源码文件来说,这不是必须的. 每一个工作区的结构都类似下图所示:/home/hypermind/golib: ...

  10. go语言笔记——go环境变量goroot是安装了路径和gopath是三方包路径

    Go 环境变量 Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之间就已经设置好他们.如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go  ...

随机推荐

  1. 为啥动态显示的名字就显示了undefined?

    看不懂了昂,记录一下,慢慢理解吧 <!DOCTYPE html> <html> <head> <meta charset="utf-8"& ...

  2. 全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性

    全网最适合入门的面向对象编程教程:35 Python 的内置数据类型-文档字符串和__doc__属性 摘要: 在 Python 中,文档字符串(Docstring)是一种用于为模块.类.方法或函数编写 ...

  3. milvus 结果

    milvus (2.3.3) 两个查询方法 collection.query(...) 和 collection.search(...) 的返回类型是不同的,用错了会说 attribute error ...

  4. 2023 ICPC 香港

    gym 开场发现 E 是传统数据结构题很高兴,不过先跳了.F 知道相邻两段的长度差 \(\le1\),以为最终每段长度只有 \(\lfloor\frac{n}{m+1}\rfloor,\lceil\f ...

  5. mysql学习问题记录

    Q: 问题 MySQL在创建外键索引时,使用工具会出现创建完成但是闪一下就没了 使用CONSTRAINT '外键索引名' FOREIGN KEY ('xx') REFERENCES 数据库名 (xx) ...

  6. 使用 SSH 转义代码来控制连接

    OpenSSH 最常被忽视的一个非常有用的功能是能够从连接内部控制会话的某些方面.通过使用 SSH 转义代码,我们能够在会话内部与本地 SSH 软件进行交互. 强制从客户端断开连接(如何退出卡住或冻结 ...

  7. IDEA 2023.2 最新安装使用教程(附激活码,亲测好用)

    申明:本教程 IDEA 补丁.补丁均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除.若条件允许,希望大家购买正版 ! idea激活码使用教程 Step1 第一步下载IDEA软件 ID ...

  8. Android 水平滚动List 一项Item占满一页宽 设定单次滑动一次切换一次Item

    背景:水平滚动的List,一项Item占满页面宽度,相当于数量不定的选项卡,每个选项卡占满一页,左右滑动时,如何限制一次只能滑动一个Item 步骤: 1. 水平滚动布局 linearLayoutMan ...

  9. 根据Uri,Cursor没有获取到对应的属性

    Android: 背景:调用摄像头,拍摄视频,指定保存的地址,但是返回的Cursor文件,只有名称和大小的属性,没有其他诸如时长,连ID属性都没有 使用 cursor.getInt(cursor.ge ...

  10. K8s文件解析 涉及 SLS、MSE、NAS存储卷等

    k8s.yml模板 涉及配置: 1. 存储卷(NAS) 2. SLS设定(阿里云日志采集系统) 3. MSE配置(阿里云版nacos) 4. 配置应用参数(包括路径,布尔类型数据等) apiVersi ...