Go语言包管理模式示例分析

 更新时间:2023年05月23日 09:03:59   作者:甜点cc  
这篇文章主要为大家介绍了Go语言包管理模式示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

任何一门编程语言都离不开对各种工具包的使用,工具包的管理就显得异常重要了。Go 的包管理方式是逐渐演进的,本文介绍Go语言的两种包管理模式。

GOPATH模式引包(不推荐)

在 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有多版本控制。

go的编译器会在 $GOPATH/src 下面寻找对应的模块,src 下的每一个目录都可以对应一个模块,目录中的目录也可以是一个模块

下面展示如何在入口文件main.go 里引入非标准库model包中的变量

  • 目录层级如下
├───main
│       main.go
└───model
        utils.go
  • main/main.go 入口文件引入utils里面的Name变量
  • model/utils.go 文件声明 package model,并定义变量var Name string = "xiao" ,变量必须是大写,否则报错name not exported by package model
  • main.go 文件引model包
package main
import (
    "fmt"
    // 引包
  // 省略GOPATH/src, Go编译的时候会自动在src目录下寻找
    "go_code/pointer/model"
)
func main() {
    fmt.Println(model.Name) // xiao
}

开启GO111MODULE后非module项目产生的问题

GO111MODULE=on,并且已经设置GOPATH的条件下,写的代码在$GOPATH/src下,我想要使用另一个package里面的内容,并且这个package不是标准库,或者说不在GOROOT里(一般我们不会修改GOROOT中的内容),编译会报错,如下👇👇

package go_code/pointer/model is not in GOROOT

解决方法一:

设置GO111MODULE=off

go env -w GO111MODULE=off

设置完之后, go env查看

然后重新编译即可

解决方法二

使用go mod , 请看下文介绍👇

GO MODULE 模式引包(推荐)

go module 介绍

go modules 是 golang 1.11 新加的特性。

  • 模块是相关Go包的集合
  • modules是源代码交换和版本控制的单元

go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

GO111MODULE 有三个值:off, on和auto(默认值)。

  • GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找(也就是本文最开始介绍的方式)。
  • GO111MODULE=on,go命令行会使用modules,不会去GOPATH目录下查找所引用的包。
  • GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:

    • 当前目录在GOPATH/src之外且该目录包含go.mod文件
    • 当前文件在包含go.mod文件的目录下面。

当modules功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module

利用GO111MODULEGOPROXY,可以直接将Github上的第三方库直接下载到本地使用,不需要使用go get命令。执行 go run 运行时,GOMODULES包管理工具会自动帮我们下载github上面的包

使用 go mod 创建新项目

当开启GO111MODULE的时候,才可以使用go mod

1、初始化项目

mkdir test-mod
cd test-moe
go mod init maze-mod

在项目根目录生成 go.mod 文件

module test-mod
go 1.17
require github.com/astaxie/beego v1.12.1
require (
    golang.org/x/net v0.0.0-20190620200207-3b0461eec859 // indirect
    golang.org/x/text v0.3.0 // indirect
)

注意:

indirect注释的代表间接依赖,没有的代表直接依赖,

前面是版本号+时间戳+hash(如:v0.0.0-20190620200207-3b0461eec859

  • go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时(比如go get、go build、go mod等),修改维护go.mod文件。
  • go.mod 提供了module, require、replace和exclude 四个命令

    • module 语句指定包的名字(路径)
    • require 语句指定的依赖项模块
    • replace 语句可以替换依赖项模块
    • exclude 语句可以忽略依赖项模块

2、添加依赖

  • 新建main.go文件
  • 执行 go run main.go

    • 一般来说 go mod 模式下,运行 go run 会自动安装所有依赖,但是没有安装
    • 运行 go get ./ ... 可以自动查找并下载安装所有的包
    • 运行 go get package@version 安装指定版本的依赖包

3、查看依赖

  • go list -m all 查看当前模块所依赖的包列表
  • go mod tidy 从 go.mod 中移除不需要的依赖

4、go.sum文件

用来做包版本管理

go.sum文件与go.mod文件同级。go.sum文件是对导入的依赖包的特定版本的hash校验值,作用就是记录第一次下载的依赖版本号,防止有依赖版本升级带来的不兼容问题。所以,go.modgo.sum文件都需要被加入版本管理中。

总结

  • GOPATH模式 是 go在 1.5 版本之前的包管理模式,不具备版本控制功能,且所有项目的依赖都放在 GOPATH 里面,管理比较混乱
  • GO MODULE 模式是go在1.11 版本推出的,使用git的管理方式,直接从GitHub上下载所需要的依赖,可能会存在一些安全性问题,同时国内需要设置GOPROXY代理服务器才可使用,相对来说好用一点。

包管理模式一直是各个开发语言所面临的棘手问题,比如NPMYarn,设计一种完美的包管理模式还需要不断探索实践。

以上就是Go语言包管理模式示例分析的详细内容,更多关于Go语言包管理模式的资料请关注脚本之家其它相关文章!

相关文章

  • Go泛型之泛型约束示例详解

    Go泛型之泛型约束示例详解

    这篇文章主要给大家介绍了关于Go泛型之泛型约束的相关资料,泛型是静态语言中的一种编程方式,这种编程方式可以让算法不再依赖于某个具体的数据类型,而是通过将数据类型进行参数化,以达到算法可复用的目的,需要的朋友可以参考下
    2023-12-12
  • Go Struct结构体的具体实现

    Go Struct结构体的具体实现

    Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性,本文主要介绍了Go Struct结构体的具体实现,感兴趣的可以了解一下
    2023-03-03
  • Golang中map的深入探究

    Golang中map的深入探究

    Go中Map是一个KV对集合,下面这篇文章主要给大家介绍了关于Golang中map探究的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-09-09
  • GO使用socket和channel实现简单控制台聊天室

    GO使用socket和channel实现简单控制台聊天室

    今天小编给大家分享一个简单的聊天室功能,聊天室主要功能是用户可以加入离开聊天室,实现思路也很简单明了,下面小编给大家带来了完整代码,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • golang 切片截取参数方法详解

    golang 切片截取参数方法详解

    这篇文章主要介绍了golang 切片截取参数方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Golang接口型函数使用小结

    Golang接口型函数使用小结

    接口函数指的是用函数实现接口,这样在调用的时候就会非常简便,这种方式适用于只有一个函数的接口,这里以迭代一个map为例,演示这一实现的技巧,对Golang接口型函数使用知识感兴趣的朋友一起看看吧
    2022-06-06
  • 关于golang类型推断和变量重声明详解

    关于golang类型推断和变量重声明详解

    在Go语言中,类型推断可以根据变量的初始化值自动推断出变量的类型,而不需要显式地声明变量类型,变量重声明可以在同一作用域内重复声明一个变量,只要其中至少一个是新的变量,本就简单的给大家介绍一下golang类型推断和变量重声明,需要的朋友可以参考下
    2023-08-08
  • Golang实现验证一个字符串是否为URL

    Golang实现验证一个字符串是否为URL

    在实际开发过程中,有时候会遇到 URL 的校验问题,Go 语言中有哪些方法去验证一个字符串是否满足 URL 格式呢?本文就来和大家详细讲讲
    2023-04-04
  • Go中RPC远程过程调用的实现

    Go中RPC远程过程调用的实现

    本文主要介绍了Go中RPC远程过程调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Go语言map元素的删除和清空

    Go语言map元素的删除和清空

    本文主要介绍了Go语言map元素的删除和清空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论