首页 > 其他分享 >3.2 Go语言从入门到精通:包管理工具之GOPATH

3.2 Go语言从入门到精通:包管理工具之GOPATH

时间:2023-04-14 14:03:19浏览次数:56  
标签:GOPATH 语言 source go 3.2 Go 目录


当我们真正用 Go 去做项目,或者阅读 Go 项目(如,Go 实现的开源项目)时,不可避免的会遇到包依赖问题,一些包管理方式总是很难区分、选择。Go的包管理与Java的Maven依赖管理不太一样,起初Go的包管理方式经常会被人吐槽,但随之Go版本的升级也出现了不同的包管理方式,以满足不同的需求。

今天,我们就 GOPATH 开始来了解 Go 最基本的包管理方式,让你彻底认清它。(虽然很简单,但作为系列文章还是有必然单独说一下的)

1、GOPATH

GOPATH, 被称之为“工作目录”,是 Go 语言中使用的一个环境变量,它使用绝对路径提供Go项目的绝对路径,类似于 eclipse 中的工作空间 workspace

工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率。

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

1.1 GOPATH的基本使用

其实早在[1.2 Go语言从入门到精通:开发环境搭建](./1.2 Go语言从入门到精通:开发环境搭建.md)一文中已经涉及到了 GOPATH,GOPATH的配置在安装时已经设置过了。

查看

因GOPATH作为一个环境变量而存在,可直接输入命令 go env来查看:

C:\Users\Administrator>go env
…省略其它…
set GOPATH=E:\github
…省略其它…

从命令行输出中,可以看到 GOPATH 设定的路径为:E:\github。(该GOPATH是我手动修改过的)

在 Go 1.8 版本之前,GOPATH 环境变量默认为空。从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录。

设置

选择一个目录,执行命令set GOPATH=<GOPATH>

C:\Users\Administrator>set GOPATH=E:\github

Linux环境下,执行命令 export GOPATH=<GOPATH>

1.2 GOPATH工程结构

GOPATH目录下会存在三个文件夹:

目录

描述

src

代码,可以创建多个不同的包,手动创建对应包目录。

bin

编译代码生成的二进制文件。

pkg

编译生成的中间缓存文件。

binpkg 是在编译时(如,执行go buildgo installgo get等命令)创建。

例如:

bin/
    hello                          # command executable
    outyet                         # command executable
pkg/
	……
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
	hello/
	    hello.go               # command source
	outyet/
	    main.go                # command source
	    main_test.go           # test source
	stringutil/
	    reverse.go             # package source
	    reverse_test.go        # test source
    golang.org/x/image/
        .git/                      # Git repository metadata
	bmp/
	    reader.go              # package source
	    writer.go              # package source

1.3 GOPATH和GOROOT的区别

不同于其他语言,Go 语言中没有项目的说法,只有包的概念。其中,GOROOTGOPATH 很容易被大家混为一谈。

  • GOROOT: Go 语言的安装目录。(类似于 Java 的 JDK,存放的是一些内置包、编译工具等)
  • GOPATH:我们的工作空间,即:保存 Go 的代码和第三方依赖包。

2、小结

GOPATH 是最早的依赖包管理方式,是将所有的本地代码和第三方包代码均放在 GOPATH/src 目录下,它的优点是统一管理,方便查询和引用。

但是在使用过程中会有一个非常严重的问题,那就是由于所有不同的项目都放在 GOPATH/src 目录下,当多个不同项目引用的是同一个第三方包,但是该第三包的不同版本时,便会导致严重的包依赖问题。

因此,这也是 Go 语言之初被诟病的一个点,那么该如何解决上述问题呢?


标签:GOPATH,语言,source,go,3.2,Go,目录
From: https://blog.51cto.com/xcbeyond/6190035

相关文章

  • SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null];
    网上解决方案1.起初没有创建序列s_log,因此需要在Oracle补上s_log序列。<!--增加日志--><insertid="logSave"parameterClass="com.reportcenter.sys.dto.OperateLogDto">INSERTINTOT_LOG(C_AUTOID,USRCDE,USRADDRESS,OPERATION,BEGINTME,ENDTME,OPER......
  • Go For Web:一篇文章带你用 Go 搭建一个最简单的 Web 服务、了解 Golang 运行 web 的原
    前言:本文作为解决如何通过Golang来编写Web应用这个问题的前瞻,对Golang中的Web基础部分进行一个简单的介绍。目前Go拥有成熟的Http处理包,所以我们去编写一个做任何事情的动态Web程序应该是很轻松的,接下来我们就去学习了解一些关于Web的相关基础,了解一些概念,以及......
  • google + chatgpt
    google注册网址:https://www.google.com/使用右上角登录按钮点击创建账户然后根据步骤注册chagpt注册1.https://chat.openai.com/auth/login2.1页面用不了的情况就用2使用下面的chatgpt的continuewithgoogle。然后登录谷歌账号之后按步骤即可......
  • Django Admin SimpleUI 自定义列
    DjangoAdminSimpleUI的一些简单用法注意事项:自定义列会遍历所有取出来的数据,需注意先定义下模型#models.pyclassDog(models.Model):name=models.CharField(max_length=15,verbose_name='小狗名字')age=models.IntegerField(verbose_name='小狗年龄',defa......
  • Django在类中使用装饰器
    类的视图函数中使用装饰器场景描述前后端分离项目后端暴露接口前端调用一个接口根据不同的请求方式处理不同的内容比如我有一个/user接口:get:返回成员信息post:添加信息put:修改信息delete:删除信息在每个请求中都需要判断凭证,也就是请求头中的某个字段,来鉴别用户身份,如果......
  • Django入门学习
    Django是一个开放源代码的web应用框架,由python编写,采用了MVT软件设计模式,即模型(Model)、视图(View)和模板(Template)。一、Django版本对应python版本Django版本Python版本3.23.6,3.7,3.8,3.9,3.10(在3.2.9中就已经加入了)4.03.8,3.9,3.104.13.8,3.9,3.10,3......
  • django admin 使用SimpleUI自定义按钮弹窗框示例
    actions=['button_exeScript',]defbutton_exeScript(self,request,queryset):passbutton_exeScript.layer={#弹出层中的输入框配置#这里指定对话框的标题'title':'弹出层输入框',#提示信息......
  • win10下注册goLand
    win10下注册goLand修改系统时间到2021-4-13号使用以下注册码激活S32PGH0SQB-eyJsaWNlbnNlSWQiOiJTMzJQR0gwU1FCIiwibGljZW5zZWVOYW1lIjoiSmF2YSDlpKfnpZ4iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpm......
  • Go笔记(六):切片
    切片是对数组的拓展,在Go中数组的长度一旦定义无法被修改,切片的长度是不固定的,可以理解为切片是一个可变长度数组,是一个有相同类型元素的可变长度序列。1、声明切片1.1、显示声明切片1、语法声明切片语法如下:varsclicename[]type2、示例代码1packagemain2......
  • Django笔记六之外键ForeignKey介绍
    本文首发于公众号:Hunter后端原文链接:Django笔记六之外键ForeignKey介绍这是一种一对多的字段类型,表示两张表之间的关联关系。本篇笔记的目录如下:on_deleterelated_namerelated_query_name外键字段的保存1、on_delete假设有两个application,app1和app2app1下的某......