编程笔记 Golang基础 012 项目构建

编程笔记 Golang基础 012 项目构建

  • 一、模块(Module)、包(Package)和文件
  • 二、项目结构
  • 三、VsCode项目管理
  • 四、Goland项目管理
  • 五、工作空间
  • 小结

如何构建和组织一个项目,是学习该语言编程的开始。

一、模块(Module)、包(Package)和文件

Go 语言中的模块(Module)、包(Package)和文件有着紧密的关系,它们共同构成了 Go 语言的代码组织结构和依赖管理机制:

  1. 模块(Module)

    • Go 语言从 1.11 版本开始引入了模块系统,用于管理和解决依赖问题。
    • 模块是一个独立版本控制的单元,它包含一个或多个相关的 Go 包,并通过 go.mod 文件来声明模块的路径和版本信息。
    • 每个模块都有一个唯一的模块路径,这通常是其源代码仓库的 URL 或者相对路径。
    • 模块可以发布到公共仓库如 GitHub、GitLab 等,供其他开发者引用和下载。
  2. 包(Package)

    • 包是 Go 语言中代码组织的基本单位,是相关功能的集合。
    • 在文件系统上,每个包对应一个目录,该目录下的所有 .go 源文件都属于同一包。
    • 每个 Go 源文件以 package 关键字开头声明自己所属的包名。
    • 包内定义的函数、类型、变量和常量对同一包内的其他源文件可见;对外则通过导出(首字母大写)的接口与外部包进行交互。
    • 包支持代码重用和封装,使得大型项目能够被划分为更易于理解和维护的小型组件。
  3. 文件(Files)

    • Go 语言中的文件主要包括:
      • 源代码文件:通常扩展名为 .go,包含了实现特定功能的程序代码,这些文件归属于某个包。
      • go.mod 文件:在模块根目录下,用于记录模块的依赖及其版本信息。
      • go.sum 文件:存储了模块依赖项的预期哈希值,用于校验下载的依赖包是否完整和未被篡改。
      • 执行文件:编译后的二进制文件,可以直接运行。
      • 库文件(也即归档文件 .a):编译后生成的包对象文件,存放在 $GOPATH/pkg 或模块缓存中,作为构建其他软件时的依赖。

二、项目结构

Go项目可以包含多个模块,每个模块都是一个独立的代码组织和依赖管理单元。从Go 1.18版本开始,通过引入多模块工作区(Workspaces)特性,开发者可以在一个工作区中同时处理多个模块。

在单个仓库中发布多个模块的方法:

  1. 目录结构
    • 在项目根目录下,为每个模块创建不同的子目录。
    • 每个子目录代表一个单独的Go模块,并且需要在其内部初始化一个新的 go.mod 文件。

例如:

my-project/
├── module1/
│   └── go.mod
│   └── ...
├── module2/
│   └── go.mod
│   └── ...
└── README.md
  1. 模块初始化

    • 在每个模块的子目录下运行 go mod init <module-name> 来初始化模块,其中 <module-name> 是该模块对应的路径名。
  2. 多模块工作区(Go 1.18+):

    • 使用 go work use 命令可以将多个模块添加到同一个工作区:
      cd my-project
      go work init
      go work use ./module1 ./module2
      
    • 此时,所有指定的模块都会被加入到 .work 文件中,开发工具会识别这个工作区并支持跨模块操作。
  3. 开发与构建

    • 在这样的多模块项目中,你可以分别在各个模块内进行开发、构建和测试。
    • 如果需要跨模块编译或执行,确保按照模块间引用关系正确处理。
  4. 版本控制与发布

    • 即使在一个仓库中,每个模块仍然可以拥有自己的版本控制系统分支和标签。
    • 发布时,可以通过Git Tag等方式标记每个模块的特定版本,并在其他项目中通过相应的模块路径和版本号来引用它们。
  5. 外部项目的使用

    • 其他项目可以通过各自模块的路径和版本来导入这些模块。

总之,在Go语言中,虽然一个仓库可以包含多个模块,但每个模块应该保持其逻辑上的独立性,并且通过各自的 go.mod 文件来管理和声明依赖。Go 1.18及更高版本的工作区特性极大地简化了在同一仓库中对多个模块的操作和管理。

三、VsCode项目管理

在Visual Studio Code(VSCode)中组织和管理一个Go语言项目,可以按照以下步骤进行:

  1. 安装Go插件

    • 打开VSCode。
    • 点击左侧活动栏的“Extensions”图标(或使用快捷键Ctrl + Shift + X)。
    • 在搜索框中输入“Go”,找到并安装官方的“Go for Visual Studio Code”插件。
  2. 设置Go环境

    • 确保已经在系统上正确安装了Go,并设置了GOPATH环境变量。对于Go 1.11及以上版本,推荐使用Go Modules功能来管理依赖,这样就不需要显式设置GOPATH。
    • 如果使用Go Modules,确保在终端运行go env -w GO111MODULE=on以启用模块模式。
  3. 创建项目结构

    • 在文件系统中创建一个新的目录作为项目根目录。
    • 在项目根目录下创建src子目录(如果是使用Go Modules则直接在根目录下放置源代码)。
    • 根据包结构创建相应的子目录,每个子目录代表一个Go包,其中包含.go源代码文件,并且每个文件开头声明正确的package名称。
  4. 初始化Go Modules(如果适用):

    • 在项目根目录打开终端(通过VSCode内置的终端或外部终端)。
    • 运行 go mod init <module-name> 来初始化一个新的模块,<module-name> 是你的模块路径。
  5. 依赖管理

    • 使用命令 go get <dependency> 添加依赖项,或者在编辑器内直接使用插件提供的功能添加、更新或移除依赖。
  6. 配置VSCode

    • 打开VSCode的工作区设置(File > Preferences > SettingsCtrl + ,),确保Go插件已正确识别Go SDK的位置。
    • 可以根据需要自定义Go相关设置,例如:格式化工具、代码片段、自动导入包等。
  7. 编写代码与构建

    • 直接在VSCode中编写Go源码,插件会提供语法高亮、代码补全、错误检查等功能。
    • 可以通过集成终端或任务运行 go buildgo rungo test 等命令来编译和运行项目。
  8. 调试项目

    • 创建一个调试配置文件 .vscode/launch.json,用于定义如何启动和调试程序。
    • 插件提供了模板帮助创建调试配置,包括针对本地应用、远程应用和测试用例的调试场景。
  9. 代码导航与重构

    • 利用VSCode的跳转到定义、查找引用、重命名符号等功能来管理和重构代码。

通过上述步骤,您可以在VSCode中有效地组织和管理Go语言项目。请注意,具体的步骤可能会随着时间和VSCode Go插件版本的更新而有所变化。

四、Goland项目管理

在Goland中组织和管理一个Go项目,可以按照以下步骤进行:

  1. 创建新项目

    • 打开Goland IDE。
    • 选择“File”菜单,然后点击“New Project”(或从欢迎界面直接点击“Create New Project”)。
    • 在新建项目的向导中,选择“Go”作为项目类型,并确保Go的SDK已正确配置。
    • 设置项目名称、位置以及项目结构。可以选择使用 Go Modules 进行依赖管理,这将在项目根目录下自动生成 go.mod 文件。
  2. 模块初始化

    • 如果是Go Modules项目,在终端窗口(可以通过IDE内集成的终端或者快捷键打开)进入项目根目录并运行命令 go mod init <module-name> 初始化一个新的模块,其中 <module-name> 是你的模块路径。
  3. 依赖管理

    • 添加依赖时,在终端中执行 go get <dependency> 来下载和安装所需包。
    • Goland还提供了图形化的方式来添加和管理依赖,可以在“Preferences” -> “Go” -> “Go Modules(vgo)”下查看和编辑依赖关系。
  4. 文件与包组织

    • 在项目中,按照Go语言的包结构组织文件夹和源代码文件。每个包对应一个目录,目录下的所有.go文件应具有相同的 package 声明。
    • 使用Goland的文件浏览器来创建、移动、删除文件和目录,以保持项目的整洁和逻辑清晰。
  5. 工作区设置

    • 若需同时管理多个项目,可将它们置于同一个工作区(Workspace)。在Goland中,可以通过“File”->“Open”或“Welcome”界面中的“Open”选项来打开一个包含多个项目的目录作为工作区。
  6. 版本控制

    • Goland集成了版本控制系统如Git,可以直接在IDE内部进行Git操作,如:初始化仓库 (git init)、添加文件到暂存区 (git add)、提交 (git commit)、拉取/推送 (git pull/push) 和克隆远程仓库 (git clone) 等。
  7. 构建与运行

    • 配置运行配置以启动项目,可以为不同的主程序或测试编写多个运行配置。
    • 可以通过右击文件或函数名,选择“Run ‘main.go’”(或其他指定的入口文件)来运行项目。
    • 对于服务类应用,还可以设置调试会话和热重载功能。
  8. 代码导航与重构

    • 利用Goland强大的代码补全、跳转到定义、重构工具等特性来高效地开发和维护项目。
  9. 调试与测试

    • 设置断点,通过Goland的内置调试器来调试应用程序。
    • 创建和运行测试用例,查看测试结果及覆盖率报告。

以上是一个基本的概述,实际操作过程中,Goland提供了一系列高级功能和自动化工具来简化这些步骤,帮助开发者更高效地管理和开发Go语言项目。

五、工作空间

Go 语言的工作空间(workspace)是开发者组织和管理 Go 源代码、编译后的库文件以及可执行程序的地方。在早期的 Go 版本中,工作空间的概念主要通过环境变量 GOPATH 来定义。以下是传统 GOPATH 工作空间的基本结构:

  1. src 子目录:

    • 这个目录存放所有 Go 源代码,按照包(package)的逻辑进行组织。
    • 每一个子目录对应一个包,例如:$GOPATH/src/github.com/username/project/pkgname
  2. pkg 子目录:

    • 编译后生成的归档文件(通常为 .a 文件)存放在这个目录下,这些文件代表了已编译的包。
    • 包归档文件的路径反映了源代码的路径结构,例如:$GOPATH/pkg/windows_amd64/github.com/username/project/pkgname.a
  3. bin 子目录:

    • 当使用 go installgo build -o <output> 命令时,产生的可执行文件会被放置在这个目录。
    • 可执行文件的名字与对应的包或命令相同,便于直接从命令行调用。

从 Go 1.11 版本开始,Go 引入了模块(Module)系统,允许项目以更加灵活的方式组织,并且不再强制要求使用 GOPATH。模块引入了 go.mod 文件来描述项目的依赖关系和版本信息,使得项目可以独立于 GOPATH 存放,同时提供了更好的依赖管理和构建体验。

对于使用模块系统的项目,不再需要将代码放入 GOPATH 的特定目录下,而是可以在任意位置初始化一个新的模块并开发。然而,即使在模块系统中,GOPATH 仍用于存储全局工具和第三方依赖缓存等用途。当没有显式设置 GOPATH 时,在Unix-like系统上,Go 会默认使用 $HOME/go 作为 GOPATH;在Windows系统上,则默认为 %USERPROFILE%\go

随着 Go 1.18 版本及以后的改进,多模块工作区也得到了支持,允许在一个父级目录下创建多个模块,并在同一个工作区中进行跨模块操作。

小结

有关项目组织与管理在学习过程将不断深入。这里列出的内容可供以后查询。

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

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

相关文章

MySQL 8.0.36 WorkBench安装

一、下载安装包 百度网盘链接&#xff1a;点击此处下载安装文件 提取码&#xff1a;hhwz 二、安装&#xff0c;跟着图片来 选择Custom,然后点Next 顺着左边框每一项的加号打开到每一个项的最底层&#xff0c;点击选中最底层的项目&#xff0c;再点击传过去右边的绿色箭头&a…

Codeforces Round 530 (Div. 2)

CF1099A Snowball 题目 有一个重量为 w 的雪球正在高度为 h 的地方向下滚动。每秒它的高度会减少 1。同时在高度 i 的位置它的重量会增加 i&#xff08;包括初始位置&#xff09; 同时在滚动的路线上有 2 块石头&#xff0c;第 i 块石头的高度为 hi​&#xff0c;即雪球会在 hi…

【论文阅读|基于 YOLO 的红外小目标检测的逆向范例】

基于 YOLO 的红外小目标检测的逆向范例 摘要1 引言2 相关工作2.1 逆向推理2.2 物体检测方法 3 方法3.1 总体架构3.2 逆向标准的可微分积分 4 实验4.1 数据集和指标4.2 实验环境4.4 OL-NFA 为少样本环境带来稳健性 5 结论 论文题目&#xff1a; A Contrario Paradigm for YOLO-b…

详解 leetcode_078. 合并K个升序链表.小顶堆实现

/*** 构造单链表节点*/ class ListNode{int value;//节点值ListNode next;//指向后继节点的引用public ListNode(){}public ListNode(int value){this.valuevalue;}public ListNode(int value,ListNode next){this.valuevalue;this.nextnext;} }package com.ag; import java.ut…

[树形DP] 最长乘积链

题目 1.最长乘积链 - 蓝桥云课 (lanqiao.cn) 初始思路 对问题进行分析&#xff0c;对每个点dfs去求走不同路的最远距离与次远距离求乘积&#xff0c;时间复杂度为O(n^2) 看了答案怎么弄的优化 解题思路 总的来说 预处理&#xff08;对每个结点的信息进行统计&#xff09…

AWS无服务器直播解决方案

随着媒体系统的发展&#xff0c;越来越多的直播客户想要一个即开即用的平台&#xff0c;在不需要管理和运维底层资源的同时使用一站式的媒体平台。九河云对多家云厂商有所了解及有一定合作&#xff0c;下面将按客户的需求介绍aws的无服务器直播解决方案。 架构概述&#xff1a…

Flutter插件开发指南02: 事件订阅 EventChannel

Flutter插件开发指南02: 事件订阅 EventChannel 视频 https://www.bilibili.com/video/BV1zj411d7k4/ 前言 上一节我们讲了 Channel 通道&#xff0c;但是如果你是卫星定位业务&#xff0c;原生端主动推消息给 Flutter 这时候就要用到 EventChannel 通道了。 本节会写一个 1~…

HarmonyOS 权限 介绍

权限说明 权限等级 根据权限对于不同等级应用有不同的开放范围&#xff0c;权限类型对应分为以下三种&#xff0c;等级依次提高。 normal权限 normal 权限允许应用访问超出默认规则外的普通系统资源。 这些系统资源的开放&#xff08;包括数据和功能&#xff09;对用户隐私以及…

Unity编辑器扩展之是否勾选Text组件BestFit选项工具(此篇教程也可以操作其他组件的属性)

想要批量化是否勾选项目预制体资源中Text组件BestFit属性&#xff08;此篇教程也可以操作其他组件的属性&#xff0c;只不过需要修改其中对应的代码&#xff09;&#xff0c;可以采用以下步骤。 1、在项目的Editor文件中&#xff0c;新建一个名为TextBestFitBatchProcessor的…

日常遇到Maven出现依赖版本/缓存问题通用思路。

Maven依赖错误联想 明明自己的工程是直接从大佬哪里拉下来的&#xff0c;并且自己的setting文件也是没有问题&#xff0c;可是自己偏偏编译有问题。这里介绍一种通用解决方案&#xff0c;仅供参考。 前置排查确认 我遇到原因是在JDK升级过程中遇到的&#xff1a; java.lang.…

Linux篇:指令

一 基本常识&#xff1a; 1. 文件文件内容文件的属性 2. 文件的操作对文件内容的操作对文件属性的操作 3. 文件的类型&#xff1a; d&#xff1a;目录文件 -&#xff1a;普通文件 4. 指令是可执行程序&#xff0c;指令的代码文件在系统的某一个位置存在的。/u…

Linux---进程间通讯(上)

一、进程间通讯的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff0…

pytorch使用文档

torch 张量操作&#xff08;torch&#xff09; torch.tensor(): 用数据创建一个 torch.Tensor 对象。torch.from_numpy(): 从 numpy 数组创建张量。torch.zeros(), torch.ones(), torch.rand(), torch.randn(): 创建具有特定形状的全0、全1、均匀分布随机、标准正态分布随机张…

css3实现无缝滚动,鼠标经过暂停

js也可以实现&#xff0c;但css3更加的平滑和资源占用更少。下面是具体代码&#xff0c;动画要单独用一个类名&#xff0c;否则暂停估计不会生效&#xff1a; 原理&#xff1a;动画向上移动&#xff0c;目标完全消失后&#xff0c;从头开始。js实现是获取消失的部分&#xff0…

分享10款自媒体人常用ai写作工具,总有一款适合你 #其他#AI写作

你是否因为写作困顿而感到沮丧&#xff1f;是不是希望能够找到一个能给你提供无限灵感和提高创作效率的利器&#xff1f;AI写作助手就是你的绝佳选择&#xff01;现在我向大家推荐几款好用的AI写作助手&#xff0c;它们将让你的创作之旅更加流畅、富有创意。 1.七燕写作 这是一…

十二、通过色彩空间转换进行更换图片背景

项目功能实现&#xff1a;对一张白色背景的图片进行更换成蓝色背景&#xff0c;类似抠图更换背景操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 inrange.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class INRANGE{ public:v…

入门指南:Element UI 组件的安装及使用

随着前端开发技术的不断发展&#xff0c;越来越多的开发者选择使用现成的 UI 组件库来加速项目开发并提升用户体验。其中&#xff0c;Element UI 作为一款基于 Vue.js 的组件库&#xff0c;备受开发者们的青睐。本篇博客将为大家介绍如何安装并使用 Element UI 组件&#xff0c…

华为OD机试真题-围棋的气-2023年OD统一考试(C卷)---python代码

题目&#xff1a; 代码&#xff1a; """ # 输入&#xff1a;2的倍数 第一个为行号 0-18 第二个为列号 0-18第一行为黑色 第二行为白色思路&#xff1a;先求黑色&#xff0c;进行去重棋子的位置&#xff0c;再求白色 逐个棋子求坐标。 """ d…

pytorch和tensorflow比较以及安装使用tensorflow

google brain tensorflow facebook ai pytorch TensorFlow支持Python、C、Java和Go等编程语言&#xff0c;而PyTorch主要使用Python pytorch有c语言版本性能完全没问题可以用python开发测试用c语言版本训练和部署 在TensorFlow中&#xff0c;模型的定义和计算图建立在静态图…

git重新提交commit

在Git中重新提交commit&#xff0c;通常是指修改最近的提交或者更早的提交。以下是一些常用的方法来重新提交commit&#xff1a; 修改最后的提交 如果你只是想修改最后一次提交的信息&#xff08;比如提交信息写错了&#xff09;&#xff0c;你可以使用&#xff1a; bashCopy…