【Go语言成长之路】多模块工作区入门

2024-08-27 07:44

本文主要是介绍【Go语言成长之路】多模块工作区入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 【Go语言成长之路】多模块工作区入门
    • 前提条件
    • 一、创建一个模块
    • 二、创建工作空间
    • 三、创建第二个模块
    • 四、更多关于workspace

【Go语言成长之路】多模块工作区入门

​ 多模块工作区(muti-module workspaces)可以使得开发者在多个模块中构建并且运行代码,相互独立,互不干扰。

​ 本教程中,将会创建两个模块来共享一个多模块工作区,并且跨模块进行更改,在构建中查看这些更改的结果。

前提条件

  • Go1.18以及之后的版本

  • 命令终端。 Go 可以在 Linux 和 Mac 上的任何终端以及 Windows 中的 PowerShell 或 cmd 上正常运行

  • 一个编辑代码的工具(文本编辑器)

一、创建一个模块

  1. 创建工作目录

    创建一个新的工作空间,名称为workspace

    ~$ mkdir workspace
    ~/workspace$ cd workspace
    
  2. 初始化模块

    创建一个新的模块,名称为hello

    ~/workspace$ mkdir hello
    ~/workspace$ cd hello
    ~/workspace/hello$ go mod init example.com/hello
    go: creating new go.mod: module example.com/hello
    

    在 hello 目录下创建 hello.go,内容如下:

    package mainimport ("fmt""golang.org/x/example/hello/reverse"
    )func main() {fmt.Println(reverse.String("Hello"))
    }
    

    可以看到,在代码中,我们有着一个依赖外部包,因此需要使用go get添加对golang.org/x/example/hello/reverse包的依赖:

    ~/workspace/hello$ go get golang.org/x/example/hello/reverse
    go: downloading golang.org/x/example v0.0.0-20240716161537-39e772fc2670
    go: downloading golang.org/x/example/hello v0.0.0-20240716161537-39e772fc2670
    go: added golang.org/x/example/hello v0.0.0-20240716161537-39e772fc2670
    

    最后,运行hello程序

    ~/workspace/hello$ go run hello.go 
    olleH
    

二、创建工作空间

在此步骤中,我们将创建一个 go.work 文件来指定模块的工作区。

  1. 初始化工作空间

    ~/workspace$ go work init ./hello/
    ~/workspace$ cat go.work 
    go 1.23.0 # go 指令告诉 Go 应使用哪个版本的 Go 来解释该文件use ./hello # use 指令告诉 Go 在构建时 hello 目录中的模块应该是主模块。因此,在工作区的任何子目录中,该模块都将处于活动状态。
    

    go work init 命令告诉 go 为包含 ./hello 目录中的模块的工作空间创建一个 go.work 文件。

  2. 运行工作空间目录下的程序

    $ go run ./hello
    olleH
    

    在模块或工作区之外运行 go run 命令会导致错误, 但是在工作区内运行则可以通过。

三、创建第二个模块

  1. 创建模块

    ~/workspace$ mkdir second
    ~/workspace/second$ touch second.go
    package secondimport ("fmt"
    )func Hello() {fmt.Println("second")
    }~/workspace/second$ go mod init example.com/second
    ~/workspace/second$ go mod tidy
    
  2. 将模块添加到工作区

    second模块位于./second内,将其添加到工作区:

    ~/workspace$ go work use second
    

    通过使用go work use命令就成功地将一个新模块添加到工作区内了,添加后的go.work内容如下所示:

    ~/workspace$ cat go.work 
    go 1.23.0use (./hello./second
    )
    
  3. 修改 hello 程序以使用该函数

    package mainimport ("fmt""github.com/pzs/second""golang.org/x/example/hello/reverse"
    )func main() {fmt.Println(reverse.String("Hello"))second.Hello()
    }
    
  4. 添加replace以引用本地包

    修改hello包下的go.mod文件:

    replace github.com/pzs/second => ../second
    

    之后运行go mod tidy命令:

    ~/workspace/hello$ go mod tidy
    go: found github.com/pzs/second in github.com/pzs/second v0.0.0-00010101000000-000000000000
    

    注:若引用的不是本地包,而是外部下载到本地的包修改后引用的话,则可以不使用replace,直接引用即可。默认会直接应用本地的包,而不是外部包。关于具体的例子,可以参考官方的文档: https://go.dev/doc/tutorial/workspaces

  5. 在工作空间中运行代码

    ~/workspace$ go run ./hello/
    olleH
    second
    

    Go命令在go.work文件指定的hello目录中查找命令行指定的example.com/hello模块。

    注:由于这两个模块位于同一工作区中,因此可以轻松地在一个模块中进行更改并在另一个模块中使用它。

四、更多关于workspace

go work的子命令:

  • go work use [-r] [dir]: 将 use 指令添加到 dir 的 go.work 文件中(如果存在),如果参数目录不存在,则删除 use 目录。 -r 标志递归地检查 dir 的子目录。
  • go work edit: 编辑 go.work 文件,类似于 go mod edit
  • go work sync 将工作区构建列表中的依赖项同步到每个工作区模块中。

有关工作区和 go.work 文件的更多详细信息,请参阅 Go 模块参考中的Workspaces 。

这篇关于【Go语言成长之路】多模块工作区入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas