go.work

一般学习一个小东西时,无非两点,1、怎么用? 2、为啥用?

在写一个小的项目demo时,忽然看到一个奇怪的东西“go.work”?这是啥?

好奇😯,想知道。

我是这么问AI的:

go.work的简单概念,简单运用,请举例。如果要创建好几个包,要把大纲给我列出来

第2次复习留言:
因为不同模块(mod)之间无法直接调用函数。
若需要调用函数,也需要replace去替换。
而在多个mod的根目录,设计一个go.work,则可直接调用不同mod内的函数。
简单、方便。

简答运用

go.work 是 Go 语言从 Go 1.18 版本开始引入的工作区(workspace)功能,用于管理 多个模块(packages) 的开发环境。它允许你在不修改 go.mod 文件的情况下,临时将多个本地模块关联起来,特别适合大型项目或微服务架构的开发。

核心概念

  • 工作区文件go.work 文件位于项目根目录,用于声明多个本地模块的路径。
  • 模块路径覆盖:通过 use 指令指定本地模块路径,使 Go 命令优先使用本地代码而非远程依赖。
  • 多模块开发:无需提交未完成的代码到版本库,即可在多个模块间协同开发。

简单用法示例

假设你有两个本地模块:

  1. myapp(主应用)
  2. mylib(共享库)

步骤 1:创建项目结构

my-project/├── myapp/│   ├── go.mod│   └── main.go└── mylib/├── go.mod└── utils.go

步骤 2:初始化 go.work

在项目根目录执行:

go work init ./myapp ./mylib

这会生成 go.work 文件,内容如下:

go 1.18use (./myapp./mylib
)

步骤 3:在 myapp 中引用 mylib

在 myapp/main.go 中导入 mylib

为什么要用?

Go 模块之间无法直接相互调用函数,而需要 go.work 或其他机制(如 replace 指令)的根本原因在于 Go 语言的依赖管理机制。下面从设计原理、问题场景和解决方案三个方面详细解释:

一、Go 模块的依赖解析规则

Go 语言从 1.11 版本引入了模块(module)系统,核心设计目标是:

  1. 版本确定性:通过 go.mod 文件精确记录依赖的版本,确保 “一次构建,到处相同”。
  2. 语义化导入路径:导入路径必须包含版本信息(如 example.com/mylib/v2)。
  3. 最小版本选择(Minimal Version Selection):多个依赖引用同一模块时,使用最低兼容版本。

问题场景:假设你有两个本地模块:

  • myapp(主应用)依赖 mylib v1.0.0
  • mylib(共享库)正在开发新版本 v1.0.1

如果直接在 myapp 中引用未发布的 mylib 代码,Go 命令会优先遵循 myapp/go.mod 中的版本声明(即 v1.0.0),而非本地文件系统中的代码。这导致:

  • 修改 mylib 代码后,myapp 无法立即使用新功能。
  • 必须先将 mylib 发布到远程仓库并更新版本,才能在 myapp 中引入更改。

二、go.work 如何解决问题

go.work 的核心作用是临时覆盖依赖解析规则,让 Go 命令在本地开发时优先使用指定的文件路径,而非远程模块。具体机制如下:

1. 工作区文件结构

go

// go.work
go 1.18use (./myapp./mylib
)replace example.com/mylib => ./mylib  // 可选:替换特定模块路径

2. 依赖解析优先级

当执行 go buildgo test 等命令时,Go 会按以下顺序查找模块:

  1. 工作区(go.work:优先使用 use 指令指定的本地路径。
  2. 替换规则(replace:使用 go.work 或 go.mod 中的 replace 指令。
  3. 模块缓存:从本地缓存或远程仓库下载指定版本。

3. 开发流程优化

通过 go.work,你可以:

  • 在不修改 go.mod 的情况下,同时开发多个关联模块。
  • 避免频繁发布未完成的版本到远程仓库。
  • 保持生产环境依赖的纯净性(go.work 不影响最终构建)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88608.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kimi K2万亿参数开源模型原理介绍

Kimi K2 技术全解:1T MoE 大模型如何炼成开放智能体 文章目录Kimi K2 技术全解:1T MoE 大模型如何炼成开放智能体1. 模型架构与特点:1 T MoE 的「大」与「省」2. 主要创新点:MuonClip、Agentic RL 与工具调用2.1 MuonClip 优化器&…

【CMake】CMake构建项目入门

一、CMake介绍 CMake 是一个跨平台的自动化构建工具,用于管理软件项目的编译过程。它通过简单的配置文件(CMakeLists.txt)生成特定平台的构建文件(如 Makefile、Visual Studio 项目),让开发者可以专注于代…

贪心算法题解——划分字母区间【LeetCode】

763. 划分字母区间 本题目,“同一字母最多出现在一个片段中”,因为这句话,所以本质上 这道题目属于合并区间 一、算法逻辑(逐步思路) ✅ 目标: 将字符串 s 划分成尽可能多的片段,要求&#xf…

Python----目标检测(使用YOLOV8网络训练人脸)

一、Ultralytics安装 网址:主页 -Ultralytics YOLO 文档 Ultralytics提供了各种安装方法,包括pip、conda和Docker。通过 ultralytics pip包安装最新稳定版本的YOLOv8,或克隆Ultralytics GitHub 存储库以获取最新版本。可以使用Docker在隔离的…

Filament引擎(三) ——引擎渲染流程

通过Filament引擎(二) ——引擎的调用及接口层核心对象的介绍我们知道,要在项目中使用filament,首先我们需要构建出filament的Engine的对象,然后通过filament::Engine对象实例,来构建其他对象,组装渲染场景&#xff0c…

Oracle存储过程导出数据到Excel:全面实现方案详解

技术背景与需求分析 数据导出是企业级应用的核心功能,Oracle存储过程因其高性能执行(减少网络传输)、代码复用性(封装业务逻辑)和事务安全性(ACID保障)成为理想载体。Excel作为使用率$ \geq 95% $的办公工具,其兼容性需求尤为突出。典型场景包括: 财务报表自动生成物…

解决el-table右下角被挡住部分

一部分展示不全&#xff0c;被遮挡&#xff0c;因为 最右边加了fixed"right"<el-table-column fixed"right" label"操作" width"120">解决&#xff1a;1、去除fixed"right"或2、设置样式单页面<style lang"sc…

Waiting for server response 和 Content Download

在浏览器网络调试&#xff08;如 Chrome DevTools 的 Network 面板&#xff09;中&#xff0c;Timing 选项卡下的 Waiting for server response 和 Content Download 是两个关键性能指标&#xff0c;它们分别代表了 HTTP 请求生命周期的不同阶段。以下是详细解释和优化方案&…

《Java Web程序设计》实验报告五 Java Script学习汇报

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工&#xff08;共计4人&#xff09; 2、实验方案 3、实验结果与分析 Ⅰ、简述JavaScript的产生过程与Java的关系 Ⅱ、简述JavaScript的特点有哪些 Ⅲ、简述ECMAScript的历史 Ⅳ、简述ECMAScript与J…

C#与FX5U进行Socket通信

实现效果实现步骤&#xff1a;注意&#xff1a;详细的参数这里就不说明了&#xff0c;自己网上搜即可&#xff1b;打开GX Works3 创建FX5U项目系统参数设置PLC的具体型号&#xff08;我有实物PLC&#xff09;设置IP及组态参数添加通讯设备&#xff08;这里PLC做客户端&#xff…

ubuntu20.04基于tensorRT和c++跑yolo11

设备 系统&#xff1a;Ubuntu 20.04 显卡&#xff1a;NVIDIA GeForce RTX 3050 显卡驱动&#xff1a; Driver Version: 535.183.01 CUDA Version: 12.2 关键软件版本总结 Cmake: 3.28.6 Cuda&#xff1a; 12.2.2 Cudnn: 8.9.7 TensorRT: 10.8.0.43 Python&#xff1a;3.10.1…

玖玖NFT数字藏品源码(源码下载)

玖玖NFT数字藏品源码 这套还是很不错的&#xff0c;前端uniapp&#xff0c;后端FastAdmin&#xff0c;对接汇元支付&#xff0c;富友支付&#xff0c;对接avata链&#xff0c;感兴趣的自行下载研究 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/9133…

【Redis-05】高可用方案-主从哨兵

1 概述 高可用&#xff08;High Availability&#xff09;指系统在部分节点故障时仍能持续提供服务的能力。Redis 作为核心缓存组件&#xff0c;主流的高可用方案有主从复制、哨兵模式、集群模式三种。本文介绍主从复制、哨兵模式两种高可用方案。 2 主从复制 通过 “一主多从”…

焊接机器人智能节气装置

工业焊接作为现代制造业的重要组成部分&#xff0c;广泛应用于汽车、航空航天、建筑、船舶等多个领域。随着自动化技术的快速发展&#xff0c;焊接机器人已成为提升焊接效率和质量的关键装备。在传统焊接及部分自动化焊接过程中&#xff0c;气体流失问题仍然普遍存在&#xff0…

【6.1.0 漫画数据库技术选型】

漫画数据库技术选型 &#x1f3af; 学习目标&#xff1a;掌握架构师核心技能——数据库技术选型&#xff0c;针对不同业务场景选择最合适的数据库方案 &#x1f3db;️ 第一章&#xff1a;关系型数据库对比选型 &#x1f914; MySQL vs PostgreSQL vs TiDB 想象数据库就像不同…

CVE-2022-4262/CVE-2022-3038

CVE-2022-4262&#xff08;Linux内核UAF漏洞&#xff09;漏洞原理CVE-2022-4262是Linux内核中RDS&#xff08;Reliable Datagram Sockets&#xff09;协议实现的一个UAF&#xff08;Use-After-Free&#xff0c;释放后使用&#xff09;漏洞。具体来说&#xff1a;在rds_rdma_ext…

[Token]Token merging for Vision Generation

Token Compression for Vision Domain_Generation 文章目录Image GenerationToken Merging for Fast Stable Diffusion, CVPRW 2023.Token Fusion: Bridging the Gap between Token Pruning and Token Merging, WACV 2024ToDo: Token Downsampling for Efficient Generation of…

React封装过哪些组件-下拉选择器和弹窗表单

背景&#xff08;S - Situation&#xff09;&#xff1a;在某活动管理系统中&#xff0c;前端页面需要支持用户选择“要配置的当前活动”&#xff0c;并提供「新增」「编辑」功能&#xff0c;操作内容包括填写活动名称、ID、版本号等字段。原始实现逻辑分散、复用性差&#xff…

多租户架构下的多线程处理实践指南

在现代 SaaS 系统中&#xff0c;多租户架构&#xff08;Multi-Tenant Architecture&#xff09;已成为主流。然而&#xff0c;随着系统性能要求的提升和业务复杂度的增加&#xff0c;多线程成为不可避免的技术手段。但在多租户环境下使用多线程&#xff0c;容易引发数据错乱、租…

MyBatis插件机制揭秘:从拦截器开发到分页插件实战

一、拦截器体系架构解析 1.1 责任链模式在MyBatis中的实现 MyBatis通过动态代理技术构建拦截器链&#xff0c;每个插件相当于一个切面&#xff1a; // 拦截器链构建过程 public class InterceptorChain {private final List<Interceptor> interceptors new ArrayList<…