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

Golang中的包和模块设计

在这里插入图片描述

Go,也被称为Golang,是一种静态类型、编译型语言,因其简洁性和对并发编程的强大支持而受到开发者们的喜爱。Go编程的一个关键方面是其包和模块系统,它允许创建可重用、可维护和高效的代码。本博客文章将深入探讨在Go中设计包和模块的最佳实践,重点是创建内聚且可重用的包、精心考虑API设计以及管理版本和依赖关系。

设计内聚且可重用的包

在Go中,使代码可重用的最基本构建块是函数,包则是代码重用的后续发展。Go中的包是一组Go源文件,它们被组织成一个单一单元,使代码具有模块化、可重用和可维护性。每个Go包都位于一个单独的目录中,并且旨在处理与该包的目标相关的一组问题。

在设计包时,遵循DRY(不要重复自己)原则非常重要,该原则规定您不应该再次编写相同的代码。相反,您应该尽可能地重用和扩展现有的代码。

Go包提供了几个设计特性,有助于在程序中创建“防火墙”,允许将各个部分完全隔离,仅暴露最小且清晰的API所需内容。这些特性包括:

1. 命名空间:

这允许您为包中的类型和函数选择简短而清晰的名称,而无需担心常见名称是否已在其他包中使用,因为包是自包含的。示例:

package userimport "fmt"type User struct {ID   intName string
}func CreateUser(id int, name string) User {return User{ID: id, Name: name}
}func PrintUser(u User) {fmt.Printf("User ID: %d, Name: %s\n", u.ID, u.Name)
}

2. 封装:

通过使用导出的变量和函数,您可以控制包外部可访问的内容。这种受限制的可见性允许在包级别具有非常有意义的API。示例:

package mainimport ("fmt"
)type Employee struct {ID        intName      stringSalary    float64isManager bool
}func NewEmployee(id int, name string, salary float64, isManager bool) Employee {return Employee{ID:        id,Name:      name,Salary:    salary,isManager: isManager,}
}func (e *Employee) SetManagerStatus(isManager bool) {e.isManager = isManager
}func (e Employee) PrintDetails() {fmt.Printf("ID: %d\nName: %s\nSalary: %.2f\nManager: %v\n", e.ID, e.Name, e.Salary, e.isManager)
}func main() {emp := NewEmployee(1, "Alice", 50000.0, false)emp.PrintDetails()// Try to change manager status directly (encapsulation prevents this)// emp.isManager = true // Uncommenting this will result in a compilation erroremp.SetManagerStatus(true)emp.PrintDetails()
}

在这个示例中:

  1. 我们定义了一个名为Employeestruct,包含诸如IDNameSalary等字段,以及一个未导出的isManager字段。
  2. NewEmployee函数是一个构造函数,用于创建一个新的Employee实例。
  3. SetManagerStatus方法允许受控地修改isManager字段。
  4. PrintDetails方法封装了打印员工详细信息的逻辑,包括未导出的isManager字段。
  5. main函数中,我们创建了一个Employee实例,打印了其详细信息,然后使用SetManagerStatus方法更改了经理状态。

请注意,通过将isManager字段设置为未导出,并提供一个方法来修改它,我们封装了Employee对象的内部状态并控制了对其的访问。这防止了从Employee类型外部直接修改isManager字段。

请记住,Go没有像其他一些语言那样的传统访问修饰符,因此封装依赖于命名约定以及标识符的导出或未导出。

3. 内部包:

这些禁止从内部目录的父目录树之外导入包含“internal”元素的代码。

慎重设计API

在创建API时,仔细考虑要暴露给外部世界的内容至关重要。在Go中,通过导出变量和函数来实现这一点。通过控制包外部可访问的内容,您可以在包级别提供一个非常有意义的API,并且具备更改未导出代码的灵活性,而无需担心破坏该API。

此外,慎重考虑API设计还有助于确保软件的可维护性和耐用性。正如Dave Cheney在他的Golang UK 2016主题演讲中所说:“Go程序的维护,以及它们可以发生的容易程度,将是他们决策的关键因素。”

版本控制和依赖管理

Go模块是Go包的集合,每个项目都是一个模块。模块中使用的包由Go通过go.mod文件进行管理。

Go模块使用语义化版本(Semver)系统进行版本控制,版本号由三部分组成:主版本、次版本和修订版本。例如,版本号为1.2.3的包中,1是主版本,2是次版本,3是修订版本。

开发者将自己的模块发布到自己的存储库,供其他开发者使用,并附带一个版本号。Go工具使您更轻松地管理依赖关系,包括获取模块的源代码、升级等等。

当您准备发布模块的新版本时,您可以使用go mod tidy命令来确保您的go.mod文件包含所有必要的依赖项。然后,您可以在版本控制系统中标记新版本。

总之,在Go中设计包和模块是Go编程的重要方面。通过设计内聚且可重用的包、慎重考虑API设计,以及有效管理版本和依赖关系,您可以编写干净、可维护且高效的Go代码。

相关文章:

Golang中的包和模块设计

Go,也被称为Golang,是一种静态类型、编译型语言,因其简洁性和对并发编程的强大支持而受到开发者们的喜爱。Go编程的一个关键方面是其包和模块系统,它允许创建可重用、可维护和高效的代码。本博客文章将深入探讨在Go中设计包和模块…...

web:[极客大挑战 2019]Upload

题目 页面显示为一个上传&#xff0c;猜测上传一句话木马文件 先查看源代码看一下有没有有用的信息&#xff0c;说明要先上传图片&#xff0c;先尝试上传含有一句话木马的图片 构造payload <?php eval($_POST[123]);?> 上传后页面显示为&#xff0c;不能包含<&…...

ICMP差错包

ICMP报文分类 Type Code 描述 查询/差错 0-Echo响应 0 Echo响应报文 查询 3-目的不可达 0 目标网络不可达报文 差错 1 目标主机不可达报文 差错 2 目标协议不可达报文 差错 3 目标端口不可达报文 差错 4 要求分段并设置DF flag标志报文 差错 5 源路由…...

算法基础课第二部分

算法基础课 第四讲 数学知识AcWing1381. 阶乘(同余&#xff0c;因式分解) 质数AcWing 866. 质数的判定---试除法AcWing 868. 质数的判定---埃氏筛AcWing867. 分解质因数---试除法AcWing 197. 阶乘---分解质因数---埃式筛 约数AcWing 869. 求约数---试除法AcWing 870. 约数个数-…...

【数据结构】外部排序、多路平衡归并与败者树、置换-选择排序(生成初始归并段)、最佳归并树算法

目录 1、外部排序 1.1 基本概念 1.2 方法 2、多路平衡归并与败者树 2.1 K路平衡归并 2.2 败者树 3、置换-选择排序&#xff08;生成初始归并段&#xff09;​编辑 4、最佳归并树 4.1 理论基础​编辑 4.2 构造方法 ​编辑 5、各种排序算法的性质 1、外部排序 1.1 基本概…...

抽象工厂模式 创建性模式之五

在看这篇文章之前&#xff0c;请先看看“简单工厂模式”和“工厂方法模式”这两篇博文&#xff0c;会更有助于理解。我们现在已经知道&#xff0c;简单工厂模式就是用一个简单工厂去创建多个产品&#xff0c;工厂方法模式是每一个具体的工厂只生产一个具体的产品&#xff0c;然…...

servlet如何获取PUT和DELETE请求的参数

1. servlet为何不能获取PUT和DELETE请求的参数 Servlet的规范是POST的数据需要转给request.getParameter*()方法&#xff0c;没有规定PUT和DELETE请求也这么做 The Servlet spec requires form data to be available for HTTP POST but not for HTTP PUT or PATCH requests. T…...

【Vue.js】使用Element中的Mock.js搭建首页导航左侧菜单---【超高级教学】

一&#xff0c;Mock.js 1.1 认识Mock.js Mock.js是一个用于前端开发中生成随机数据、模拟接口响应的 JavaScript 库。模拟数据的生成器&#xff0c;用来帮助前端调试开发、进行前后端的原型分离以及用来提高自动化测试效率 总结来说&#xff0c;Element中的Mock.js是一个用于…...

从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!

大模型已经成为未来技术发展方向的重大变革&#xff0c;热度之下更需去虚向实&#xff0c;让技术走进产业场景。在这样的背景下&#xff0c;百度智能云于近期发起了“百度智能云千帆大模型平台应用开发挑战赛”。 挖掘大模型落地应用 千帆大模型平台应用开发挑战赛启动 在不久前…...

简单三步 用GPT-4和Gamma自动生成PPT PDF

1. 用GPT-4 生产PPT内容 我想把下面的文章做成PPT&#xff0c;请你给出详细的大纲和内容 用于谋生的知识&#xff0c;学生主要工作是学习&#xff0c;成年人的工作是养家糊口&#xff0c;这是基本的要求&#xff0c;在这之上&#xff0c;才能有更高的追求。 不要短期期望过高…...

QT设置弹窗显示屏幕中央

Qt设置每次运行弹窗显示屏幕中央 要确保Qt应用程序中的弹出窗口每次都显示在屏幕的中央&#xff0c;您可以使用以下方法&#xff1a; 使用QMessageBox的move方法手动设置窗口位置&#xff1a; #include <QApplication> #include <QMessageBox> #include <QDesk…...

正点原子嵌入式linux驱动开发——STM32MP1启动详解

STM32单片机是直接将程序下载到内部 Flash中&#xff0c;上电以后直接运行内部 Flash中的程序。 STM32MP157内部没有供用户使用的 Flash&#xff0c;系统都是存放在外部 Flash里面的&#xff0c;比如 EMMC、NAND等&#xff0c;因此 STM32MP157上电以后需要从外部 Flash加载程序…...

FPGA的数字钟带校时闹钟报时功能VHDL

名称&#xff1a;基于FPGA的数字钟具有校时闹钟报时功能 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 1、计时功能:这是数字钟设计的基本功能&#xff0c;每秒钟更新一次,并且能在显示屏上显示当前的时间。 2、闹钟功能:如果当前的时间与闹钟设置的时…...

分析各种表达式求值过程

目录 算术运算与赋值 编译器常用的两种优化方案 常量传播 常量折叠 加法 Debug编译选项组下编译后的汇编代码分析 Release开启02执行效率优先 减法 Release版下优化和加法一致&#xff0c;不再赘述 乘法 除法 算术结果溢出 自增和自减 关系运算与逻辑运算 JCC指…...

企业风险管理策略终极指南

企业风险管理不一定是可怕的。企业风险管理是一个模糊且难以定义的主题领域。它涵盖了企业的多种风险和程序&#xff0c;与传统的风险管理有很大不同。 那么&#xff0c;企业风险管理到底是什么&#xff1f;在本文中&#xff0c;我们将确定它是什么&#xff0c;提出两种常见的…...

OpenCV之分水岭算法(watershed)

Opencv 中 watershed函数原型&#xff1a; void watershed( InputArray image, InputOutputArray markers ); 第一个参数 image&#xff0c;必须是一个8bit 3通道彩色图像矩阵序列&#xff0c;第一个参数没什么要说的。关键是第二个参数 markers&#xff0c;Opencv官方文档的说…...

npm 命令

目录 初始化 搜索 安装 删除 更新 换源 查看 其他 补充 1.初始化 npm init #初始化一个package.json文件 npm init -y | npm init --yes 2.搜索 npm s jquery | npm search jquery 3.安装 npm install npm -g #更新到最新版本 npm i uniq | npm ins…...

【bug 记录】yolov5_C_demo 部署在 rv1126

问题1&#xff1a;opencv find 不到 在 CMakeLists 中将正确的 OpenCV库 路径添加到 CMAKE_PREFIX_PATH 变量中 set(CMAKE_PREFIX_PATH “/mnt/usr/local” ${CMAKE_PREFIX_PATH}) 问题2&#xff1a; rknn_api.h 找不到 将该文件从别处复制到项目 include 文件夹 问题3&…...

[vue-admin-template实战笔记]

1.克隆项目 git clone gitgitee.com:panjiachen/vue-admin-template.git 2.安装依赖 npm install 3.运行项目就会自动打开网页&#xff0c;并且热部署插件 npm run dev 4.查看代码 //将vue-admin-template拖入到idea中即可查看代码 1)并且发现&#xff0c;常用的东西已经集…...

unity 限制 相机移动 区域(无需碰撞检测)

限制功能原著地址&#xff1a;unity限制相机可移动区域&#xff08;box collider&#xff09;_unity限制相机移动区域_manson-liao的博客-CSDN博客 一、创建限制区域 创建一个Cube&#xff0c;Scale大小1&#xff0c;添加组件&#xff1a;BoxCollder&#xff0c;调整BoxColld…...

Hudi第二章:集成Spark

系列文章目录 Hudi第一章&#xff1a;编译安装 Hudi第二章&#xff1a;集成Spark 文章目录 系列文章目录前言一、安装Spark1、安装Spark2.安装hive 二、spark-shell1.启动命令2.插入数据3.查询数据1.转换DF2.查询 3.更新4.时间旅行5.增量查询6.指定时间点查询7.删除数据1.获取…...

springboot和vue:八、vue快速入门

vue快速入门 新建一个html文件 导入 vue.js 的 script 脚本文件 <script src"https://unpkg.com/vuenext"></script>在页面中声明一个将要被 vue 所控制的 DOM 区域&#xff0c;既MVVM中的View <div id"app">{{ message }} </div…...

docker-compose内网本地安装

1&#xff1a;通过包管理器安装 Docker Compose&#xff0c;请按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你的系统上已经安装了 Docker。如果尚未安装 Docker&#xff0c;请根据你的操作系统使用适当的包管理器进行安装打开终端&#xff0c;并运行以下命令下载 D…...

ThreeJs的场景实现鼠标拖动旋转控制

前面一个章节中已经实现在场景中放置一个正方体&#xff0c;并添加灯光使得正方体可见。但是由于是静态的还不能证明是3D的&#xff0c;我们需要添加一些控制器&#xff0c;使得通过鼠标控制正方体可以动起来&#xff0c;实现真正的3D效果&#xff0c;由此引入OrbitControls组件…...

jdk 管理工具比对 jEnv jabba SDKMAN

jEnv、jabba、SDKMAN 这三个 JDK 管理工具进行的比对&#xff1a; jEnv&#xff1a; 地址&#xff1a;https://github.com/jenv/jenv 作者&#xff1a;Gildas Cuisinier 最后更新时间&#xff1a;2021年5月26日 开发语言&#xff1a;Shell Jabba&#xff1a; 地址&#xff1…...

华为云云耀云服务器L实例评测|部署在线图表和流程图绘制工具drawio

华为云云耀云服务器L实例评测&#xff5c;部署在线图表和流程图绘制工具drawio 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 优势及其应用场景1.3 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 drawio3.1 drawio 介绍3.2 Docker 环…...

elementui引入弹出框报错:this.$alert is not defined 解决方案

1.按需引入文件element.js 注意&#xff1a;引入Message&#xff0c;MessageBox两个组件就行&#xff0c;alert包括在MessageBox里面了。 之前我引入了Alert组件&#xff0c;发现不行 2.在vue的prototype里注册伪名字 3.组件里直接调用就行了 4.实现效果 我发现elementui调用…...

docker的组件和资源管理

Docker是一种开源的容器化平台&#xff0c;它提供了一种轻量级、可移植和可扩展的方式来打包、部署和运行应用程序。Docker的构成包括以下几个关键组件&#xff1a; Docker Engine&#xff1a;Docker Engine是Docker的核心组件&#xff0c;它负责管理容器的生命周期和资源隔离…...

SEO的优化教程(百度SEO的介绍和优化)

百度SEO关键字介绍&#xff1a; 百度SEO关键字是指用户在搜索引擎上输入的词语&#xff0c;是搜索引擎了解网站内容和相关性的重要因素。百度SEO关键字可以分为短尾词、中尾词和长尾词&#xff0c;其中长尾词更具有针对性和精准性&#xff0c;更易于获得高质量的流量。蘑菇号-…...

Tomcat以及UDP

一、Tomcat 服务端 自定义 S Tomcat服务器 S &#xff1a;Java后台开发 客户端 自定义 C 浏览器 B 认识一些常用的目录&#xff1a; bin&#xff1a;存放开始和结束的程序 conf&#xff1a;配置文件 lib&#xff1a;组成包 logs&#xff1a;输出日志 webapps&#x…...

dw个人网站制作/深圳网站开发制作

一&#xff1a;利用jquery方法获得 1&#xff1a;取值 $(window.parent.document).find("#second_navigator").html(); 2&#xff1a;改变父页面元素 $(window.parent.document).find("#second_navigator").html(“我是从iframe里传来的值”); 二&…...

苏州企业网站建设开发与制作/都有什么推广平台

最近用ThinkPHP做了一个邮箱找回密码功能&#xff0c;在遭遇了N个bug之后终于做成了&#xff0c;下面分享一下邮箱找回密码功能的实现&#xff1a; 邮箱找回密码实际上就是在用户通过验证之后重置密码的过程&#xff0c;一般开发者会在验证用户信息后通过程序生成一个新密码 或…...

只用html5可以做网站吗/aso优化软件

目录中的文件显示ls -l长文件输出ls -a显示所有文件ls -al长文件格式显示所有文件ls -alh显示所有文件&#xff0c;显示文件大小ls -alhs 显示所有文件&#xff0c;显示文件大小&#xff0c;按字母先后顺序排序&#xff0c;正序ls -alhsr 显示所有文件&#xff0c;显示文件大小…...

南京企业做网站/十大外贸平台

整数划分 &#xff0d;&#xff0d;&#xff0d; 一个老生长谈的问题:  1) 练练组合数学能力.2) 练练递归思想3) 练练DP总之是一道经典的不能再经典的题目:这道好题求:1. 将n划分成若干正整数之和的划分数。2. 将n划分成k个正整数之和的划分数。3. 将n划分成最大数不超过k的划…...

做网站美工赚钱吗/外贸网站都有哪些

libxml_disable_entity_loader &#xff08;PHP 5> 5.2.11&#xff0c;PHP 7&#xff09; libxml_disable_entity_loader - 禁用加载外部实体的功能 描述 bool libxml_disable_entity_loader &#xff08;[ bool $disableTRUE ]&#xff09; 禁用/启用加载外部实体的功能…...

传送门网站是怎么做的/自助建站网

Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3 http://blog.csdn.net/sunbow0 第二章Deep Belief Network (深度信念网络) 3实例 3.1 測试数据 依照上例数据&#xff0c;或者新建图片识别数据。 3.2 DBN实例 //****************例2&#xff08;读…...