当前位置: 首页 > news >正文

网站弹出信息怎么做的/关键词优化排名费用

网站弹出信息怎么做的,关键词优化排名费用,游戏设计,上海专业高端网站建设服务公司Golang 基础 Go Modules包管理 在 Go 项目开发中,依赖包管理是一个非常重要的内容,依赖包处理不好,就会导致编译失败,本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史,并详细介绍下…

Golang 基础 Go Modules包管理

在 Go 项目开发中,依赖包管理是一个非常重要的内容,依赖包处理不好,就会导致编译失败,本文将系统介绍下 Go 的依赖包管理工具。

我会首先介绍下 Go 依赖包管理工具的历史,并详细介绍下目前官方推荐的依赖包管理方案 Go Modules。Go Modules 主要包括了 go mod 命令行工具、模块下载机制,以及两个核心文件 go.mod 和 go.sum。

Go Modules 简介

Go Modules 是 Go 官方推出的一个 Go 包管理方案,基于 vgo 演进而来,具有下面这几个特性:

  • 可以使包的管理更加简单
  • 支持版本管理
  • 允许同一个模块多个版本共存
  • 可以校验依赖包的哈希值,确保包的一致性,增加安全性
  • 内置在几乎所有的 go 命令中,包括go get、go build、go install、go run、go test、go list等命令。
  • 具有 Global Caching 特性,不同项目的相同模块版本,只会在服务器上缓存一份。

在 Go1.14 版本以及之后的版本,Go 官方建议在生产环境中使用 Go Modules。

因此,以后的 Go 包管理方案会逐渐统一到 Go Modules

Go 包管理的历史

在具体讲解 Go Modules 之前,我们先看一下 Go 包管理的历史。从 Go 推出之后,因为没有一个统一的官方方案,所以出现了很多种 Go 包管理方案,比较混乱,也没有彻底解决 Go 包管理的一些问题。Go 包管理的历史如下图所示:

在这里插入图片描述

这张图展示了 Go 依赖包管理工具经历的几个发展阶段:

Go1.5 版本前:GOPATH

在 Go1.5 版本之前,没有版本控制,所有的依赖包都放在 GOPATH 下。采用这种方式,无法实现包的多版本管理,并且包的位置只能局限在 GOPATH 目录下。如果 A 项目和 B 项目用到了同一个 Go 包的不同版本,这时候只能给每个项目设置一个 GOPATH,将对应版本的包放在各自的 GOPATH 目录下,切换项目目录时也需要切换 GOPATH,这些都增加了开发和实现的复杂度。

Go1.5 版本:Vendoring

Go1.5 推出了 vendor 机制,并在 Go1.6 中默认启用。在这个机制中,每个项目的根目录都可以有一个 vendor 目录,里面存放了该项目的 Go 依赖包。

在编译 Go 源码时,Go 优先从项目根目录的 vendor 目录查找依赖;如果没有找到,再去 GOPATH 下的 vendor 目录下找;如果还没有找到,就去 GOPATH 下找。这种方式解决了多 GOPATH 的问题,但是随着项目依赖的增多,vendor 目录会越来越大,造成整个项目仓库越来越大。

在 vendor 机制下,一个中型项目的 vendor 目录有几百 M 的大小一点也不奇怪。

Go1.9 版本:Dep

Golang 依赖管理工具混乱的局面最终由官方来终结了:Golang 官方接纳了由社区组织合作开发的 Dep,作为 official experiment。在相当长的一段时间里,Dep 作为标准,成为了事实上的官方包管理工具。

Go1.11 版本之后:Go Modules

Go1.11 版本推出了 Go Modules 机制,Go Modules 基于 vgo 演变而来,是 Golang 官方的包管理工具。在 Go1.13 版本,Go 语言将 Go Modules 设置为默认的 Go 管理工具;在 Go1.14 版本,Go 语言官方正式推荐在生产环境使用 Go Modules,并且鼓励所有用户从其他的依赖管理工具迁移过来。

Go 1.11 发布时候提到:

This release adds preliminary support for a new concept called “modules,” an alternative to GOPATH with integrated support for versioning and package distribution.

此版本增加了对称为“模块”的新概念的初步支持,这是 GOPATH 的替代方案,集成了对版本控制和包分发的支持。

至此,Go 终于有了一个稳定的、官方的 Go 包管理工具, 下面再来介绍下 Go Modules 的使用方法。

包(package)和模块(module)

Go 程序被组织到 Go 包中,Go 包是同一目录中一起编译的 Go 源文件的集合。在一个源文件中定义的函数、类型、变量和常量,对于同一包中的所有其他源文件可见。模块是存储在文件树中的 Go 包的集合,并且文件树根目录有 go.mod 文件。go.mod 文件定义了模块的名称及其依赖包,通过导入路径和版本描述一个依赖。

模块和包的关系更像是集合和元素的关系,包属于模块,一个模块是零个或者多个包的集合。下面的代码段,引用了一些包:

import (// Go 标准包"fmt"// 第三方包"github.com/spf13/pflag"// 匿名包_ "github.com/jinzhu/gorm/dialects/mysql"// 内部包"github.com/marmotedu/iam/internal/apiserver"
)

这里的fmt、http://github.com/spf13/pflag和http://github.com/marmotedu/iam/internal/apiserver都是 Go 包。

Go 中有 4 种类型的包:

  • Go 标准包:在 Go 源码目录下,随 Go 一起发布的包。
  • 第三方包:第三方提供的包,比如来自于 http://github.com 的包。
  • 匿名包:只导入而不使用的包。通常情况下,我们只是想使用导入包产生的副作用,即引用包级别的变量、常量、结构体、接口等,以及执行导入包的init()函数。
  • 内部包:项目内部的包,位于项目目录下。

下面的目录定义了一个模块:

$ ls hello/
go.mod  go.sum  hello.go  hello_test.go  world

hello 目录下有一个 go.mod 文件,说明了这是一个模块,该模块包含了 hello 包和一个子包 world。该目录中也包含了一个 go.sum 文件,该文件供 Go 命令在构建时判断依赖包是否合法。

Go Modules 命令

Go Modules 的管理命令为go mod,go mod有很多子命令,你可以通过go help mod来获取所有的命令。

下面我来具体介绍下这些命令。

  • download:下载 go.mod 文件中记录的所有依赖包。
  • edit:编辑 go.mod 文件。
  • graph:查看现有的依赖结构。
  • init:把当前目录初始化为一个新模块。
  • tidy:添加丢失的模块,并移除无用的模块。默认情况下,Go 不会移除 go.mod 文件中的无用依赖。当依赖包不再使用了,可以使用go mod tidy命令来清除它。
  • vendor:将所有依赖包存到当前目录下的 vendor 目录下。
  • verify:检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查下载后是否有修改。
  • why:查看为什么需要依赖某模块。

Go Modules 开关

如果要使用 Go Modules,在 Go1.14 中仍然需要确保 Go Modules 特性处在打开状态。

你可以通过环境变量 GO111MODULE 来打开或者关闭。

GO111MODULE 有 3 个值:

  • auto:在 Go1.14 版本中是默认值,在$GOPATH/src下,且没有包含 go.mod 时则关闭 Go Modules,其他情况下都开启 Go Modules。
  • on:启用 Go Modules,Go1.14 版本推荐打开,未来版本会设为默认值。
  • off:关闭 Go Modules,不推荐。

所以,如果要打开 Go Modules,建议直接设置export GO111MODULE=on。

go.mod 和 go.sum 介绍

go.mod 文件是 Go Modules 的核心文件。下面是一个 go.mod 文件示例:

module github.com/marmotedu/iamgo 1.17require (github.com/AlekSi/pointer v1.1.0github.com/appleboy/gin-jwt/v2 v2.6.3github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535github.com/gin-gonic/gin v1.6.3github.com/golangci/golangci-lint v1.30.0 // indirectgithub.com/google/uuid v1.0.0github.com/blang/semver v3.5.0+incompatiblegolang.org/x/text v0.3.2
)replace (github.com/gin-gonic/gin => /home/colin/gingolang.org/x/text v0.3.2 => github.com/golang/text v0.3.2
)exclude (github.com/google/uuid v1.1.0
)

go.mod 语句

go.mod 文件中包含了 4 个语句,分别是 module、require、replace 和 exclude。

  • module:用来定义当前项目的模块路径。
  • go:用来设置预期的 Go 版本,目前只是起标识作用。
  • require:用来设置一个特定的模块版本,格式为<导入包路径> <版本> [// indirect]。
  • exclude:用来从使用中排除一个特定的模块版本,如果我们知道模块的某个版本有严重的问题,就可以使用 exclude 将该版本排除掉。
  • replace:用来将一个模块版本替换为另外一个模块版本。格式为 $module => n e w m o d u l e , newmodule , newmodulenewmodule可以是本地磁盘的相对路径,例如http://github.com/gin-gonic/gin => ./gin。也可以是本地磁盘的绝对路径,例如http://github.com/gin-gonic/gin => /home/lk/gin。还可以是网络路径,例如http://golang.org/x/text v0.3.2 => http://github.com/golang/text v0.3.2。

这里需要注意,虽然我们用 n e w m o d u l e 替换了 newmodule替换了 newmodule替换了module,但是在代码中的导入路径仍然为$module。

replace 在实际开发中经常用到,下面的场景可能需要用到 replace:

  1. 在项目开发初期,A 项目依赖 B 项目的包,但 B 项目因为种种原因没有 push 到仓库,这时也可以在 go.mod 中把依赖包替换为 B 项目的本地磁盘路径。

  2. 在国内访问 http://golang.org/x 的各个包都需要翻墙,可以在 go.mod 中使用 replace,替换成 GitHub 上对应的库,例如http://golang.org/x/text v0.3.0 => http://github.com/golang/text v0.3.0。

go.mod 版本号

go.mod 文件中有很多版本号格式,这里,我来详细说明一下。

  • 如果模块具有符合语义化版本格式的 tag,会直接展示 tag 的值,例如 http://github.com/AlekSi/pointer v1.1.0
  • 除了 v0 和 v1 外,主版本号必须显试地出现在模块路径的尾部,例如http://github.com/appleboy/gin-jwt/v2 v2.6.3

• 对于没有 tag 的模块,Go 命令会选择 master 分支上最新的 commit,并根据 commit 时间和哈希值生成一个符合语义化版本的版本号,例如http://github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535。

• 如果模块名字跟版本不符合规范,例如模块的名字为http://github.com/blang/semver,但是版本为 v3.5.0(正常应该是http://github.com/blang/semver/v3),go 会在 go.mod 的版本号后加+incompatible表示。

• 如果 go.mod 中的包是间接依赖,则会添加// indirect注释,例如http://github.com/golangci/golangci-lint v1.30.0 // indirect。

这里再详细介绍下出现// indirect的情况:

原则上 go.mod 中出现的都是直接依赖,但是下面的情况只要出现,就会在 go.mod 中添加间接依赖。

如果模块 A 依赖模块 B,模块 B 依赖 B1 和 B2,但是 B 没有 go.mod 文件,则 B1 和 B2 会记录到 A 的 go.mod 文件中,并在最后加上// indirect。

参考

  • https://zhuanlan.zhihu.com/p/635696935

相关文章:

Golang 基础 Go Modules包管理

Golang 基础 Go Modules包管理 在 Go 项目开发中&#xff0c;依赖包管理是一个非常重要的内容&#xff0c;依赖包处理不好&#xff0c;就会导致编译失败&#xff0c;本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史&#xff0c;并详细介绍下…...

图数据库 之 Neo4j - 背景介绍(1)

引言 Neo4j是一种高性能的图数据库&#xff0c;它专门设计用于存储、管理和查询大规模的图数据。与传统的关系型数据库不同&#xff0c;Neo4j以图的形式存储数据&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种图数据模型非常适合表示复杂的关系和连接。…...

JAVA中的单例模式->饿汉式

一、步骤 1.构造器私有化>防止直接new // 步骤一、构造器私有化>防止直接new private GirlFriend(String name){System.out.println("构造器被调用");this.name name; } 2.类的内部创建对象 // 步骤二、类的内部创建对象&#xff08;该对象是static&#x…...

从零开始手写mmo游戏从框架到爆炸(三)— 服务启动接口与网络事件监听器

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 上一章我们完成了netty服务启动的相关抽象&#xff08;https://blog.csdn.net/money9sun/article/details/136025471&#xff09;&#xff0c;这一章我们再新增一个全…...

git 合并多条提交记录

我要合并多条提交记录&#xff08;合并前7条为一条&#xff09;&#xff0c;实现如下效果&#xff1a; 使用git rebase // 查看前10个commit git log -10 // 将7个commit压缩成一个commit&#xff1b;注意&#xff1a;vim编辑器 git rebase -i HEAD~4 // add已经跟踪的文件 g…...

C++多线程:this_thread 命名空间

std::this_thread 是 C 标准库中提供的一个命名空间&#xff0c;它包含了与当前线程相关的功能。这个命名空间提供了许多与线程操作相关的工具&#xff0c;使得在多线程环境中更容易进行编程。 源码类似于如下&#xff1a; namespace std{namespace this_thread{//...........…...

《山雨欲来-知道创宇 2023 年度 APT 威胁分析总结报告》

下载链接: https://pan.baidu.com/s/1eaIOyTk12d9mcuqDGzMYYQ?pwdzdcy 提取码: zdcy...

Qt信号和槽机制(什么是信号和槽,connect函数的形式,按钮的常用信号,QWidget的常用槽,自定义槽函数案例 点击按钮,输出文本)

一.什么是信号和槽 信号槽式Qt中的一个很重要的机制。信号槽实际上是观察者模式,当发生了感兴趣的事件&#xff0c;某一个操作就会被自动触发。当某个事件发生之后&#xff0c;比如按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号。这种发出类似广播。如果有对象对…...

彻底弄懂mktemp命令的作用

mktemp 是一个在 Unix 和类 Unix 系统中用于创建临时文件或目录的命令行工具。它属于 GNU coreutils 套件的一部分。mktemp 的主要优点是它能够生成一个唯一的文件名&#xff0c;这有助于避免文件名冲突&#xff0c;并且可以安全地创建临时文件&#xff0c;因为这些文件通常只有…...

政安晨:示例演绎TensorFlow的官方指南(二){Estimator}

咱们接着演绎TensorFlow官方指南&#xff0c;我的这个系列的上一篇文章为&#xff1a; 政安晨&#xff1a;示例演绎TensorFlow的官方指南&#xff08;一&#xff09;{基础知识}https://blog.csdn.net/snowdenkeke/article/details/136067030为什么要演绎官方指南&#xff0c;我…...

vue3:24—组件通信方式

目录 1、props 2、自定义事件 &#xff08;emit&#xff09; 3、mitt&#xff08;任意组件的通讯&#xff09; 4、v-model【封装ui组件库用的多&#xff0c;平时用的少。和vue2有点不同】 5、$attrs 6、$refs和$parent 7、provide和inject 8、pinia&#xff08;即vue2中…...

WebGL+Three.js入门与实战——绘制水平移动的点、通过鼠标控制绘制(点击绘制、移动绘制、模拟画笔)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

大数据环境搭建(一)-Hive

1 hive介绍 由Facebook开源的,用于解决海量结构化日志的数据统计的项目 本质上是将HQL转化为MapReduce、Tez、Spark等程序 Hive表的数据是HDFS上的目录和文件 Hive元数据 metastore&#xff0c;包含Hive表的数据库、表名、列、分区、表类型、表所在目录等。 根据Hive部署模…...

mac电脑上使用android studio创建flutter项目

mac电脑环境配置可以看这篇文章&#xff1a;https://xiaoshen.blog.csdn.net/article/details/136068650 配置玩环境之后&#xff0c;开始创建第一个flutter项目&#xff1a;点击new flutter project或者new project都可以 然后选择flutter&#xff1a; 并将sdk配置为解压后的…...

Excel——分类汇总

1.一级分类汇总 Q&#xff1a;请根据各销售地区统计销售额总数。 第一步&#xff1a;排序&#xff0c;我们需要根据销售地区汇总数据&#xff0c;我们就要对【销售地区】的内容进行排序。点击【销售地区】列中任意一个单元格&#xff0c;选择【数据】——【排序】&#xff0c…...

Backtrader 文档学习- Observers - Reference

Backtrader 文档学习- Observers - Reference 1.Benchmark class backtrader.observers.Benchmark() 观察器存储策略的回报和参考资产的回报&#xff0c;参考资产是传递给系统的数据之一。 参数&#xff1a; timeframe (default: None) &#xff0c;如果None&#xff0c;则将…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Radio组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Radio组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Radio组件 单选框&#xff0c;提供相应的用户交互选择项。 子组件 无。 接口 …...

【go】结构体切片去重

场景 自定义结构体切片&#xff0c;去除切片中的重复元素&#xff08;所有值完全相同&#xff09; 代码 // 自定义struct去重 type AssetAppIntranets struct {ID string json:"id,omitempty"AppID string json:"app_id,omitempty"IP …...

百面嵌入式专栏(面试题)C语言面试题22道

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍C语言相关面试题 。 宏定义是在编译的哪个阶段被处理的?答案:宏定义是在编译预处理阶段被处理的。 解读:编译预处理:头文件包含、宏替换、条件编译、去除注释、添加行号。 写一个“标准”宏MIN,这个…...

Docker方式创建keepalived连接MGR集群

记录一下简单的搭建步骤以便后期查验 目录 前言步骤1. 安装环境2. 重新制作镜像3. 导入新镜像4. 创建容器 前言 假设已经搭建了MySQL8的MGR集群方式&#xff08;一主两从&#xff09;。 MGR本身有故障转移重新选举新的主节点功能&#xff0c;但是上游的应用程序需要自己手动修…...

Oracle PL/SQL Programming 第5章:Iterative Processing with Loops 读书笔记

总的目录和进度&#xff0c;请参见开始读 Oracle PL/SQL Programming 第6版 本章探讨 PL/SQL 的迭代控制结构&#xff08;也称为循环&#xff09;&#xff0c;它允许您重复执行相同的代码。 PL/SQL 提供了三种不同类型的循环结构&#xff1a; 简单或无限循环FOR 循环&#x…...

C入门番外篇——C, Are you OK?

今日路上看到一个车牌&#xff0c;52U0K&#xff0c;感觉很有意思&#xff0c;如果做一下简单的翻译就是&#xff0c;“我爱你&#xff0c;好么&#xff1f;” 这样让我脑子中闪现了这样的一个画面&#xff1a;“一个男生追一个女生&#xff0c;看到女生不怎么搭理自己的样子&a…...

python-产品篇-游戏-象棋

文章目录 代码效果 代码 import pygame import time import constants from button import Button import pieces import computerclass MainGame():window NoneStart_X constants.Start_XStart_Y constants.Start_YLine_Span constants.Line_SpanMax_X Start_X 8 * Lin…...

用linux文件系统的链接功能实现文件缓存LRU

概述: 目前,随着家庭宽带网络、无线宽带技术,以及终端设备性能的不断发展,基于多媒体的应用越来越广泛,特别是互联网视频的应用更是成为推动这些技术发展的源动力。作为互联网视频VOD的应用,提高视频播放的流畅度是一个非常重要的指标之一。除了编解码技术,视频C…...

AI大模型开发架构设计(10)——AI大模型架构体系与典型应用场景

文章目录 AI大模型架构体系与典型应用场景1 AI大模型架构体系你了解多少?GPT 助手训练流程GPT 助手训练数据预处理2个训练案例分析 2 AI 大模型的典型应用场景以及应用架构剖析AI 大模型的典型应用场景AI 大模型应用架构 AI大模型架构体系与典型应用场景 1 AI大模型架构体系你…...

C# async/await的使用

C# 中的 async 和 await 关键字是用于实现异步编程的重要工具&#xff0c;它们简化了编写和维护非阻塞代码的过程。以下是对这两个关键字用法的简要说明&#xff1a; async 关键字 定义异步方法&#xff1a;在方法声明前使用 async 关键字&#xff0c;表示该方法是一个异步方…...

C语言之找单身狗

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 题目&#xff1a; 在一个整型数组中&#xff0c;只有一个数字出现一次&#xff0c;其他数组都是成对出现的&#xff0c;请找出那个只出现一次的数字。…...

读懂 FastChat 大模型部署源码所需的异步编程基础

原文&#xff1a;读懂 FastChat 大模型部署源码所需的异步编程基础 - 知乎 目录 0. 前言 1. 同步与异步的区别 2. 协程 3. 事件循环 4. await 5. 组合协程 6. 使用 Semaphore 限制并发数 7. 运行阻塞任务 8. 异步迭代器 async for 9. 异步上下文管理器 async with …...

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“…...

创建一个VUE项目(vue2和vue3)

背景&#xff1a;电脑已经安装完vue2和vue3环境 一台Mac同时安装vue2和vue3 https://blog.csdn.net/c103363/article/details/136059783 创建vue2项目 vue init webpack "项目名称"创建vue3项目 vue create "项目名称"...