【Go 编程实践】从零到一:创建、测试并发布自己的 Go 库

为什么需要开发自己的 Go 库

在编程语言中,包(Package)和库(Library)是代码组织和复用的重要工具。在 Go 中,包是代码的基本组织单位,每个 Go 程序都由包构成。包的作用是帮助组织代码,提供封装和代码复用的机制。

Go 包可以包含函数、类型、变量和常量等,这些元素可以被其他包引用和使用。例如,Go 的标准库提供了大量的包,如 net/http 包提供了 HTTP 客户端和服务器实现,fmt 包提供了格式化、I/O 函数等。

而库是一种特殊的包,不包含 main 函数,不能被直接运行,但可以被其他程序引用。库通常包含一些常用的功能或算法,如字符串处理、数学计算、网络通信等。

开发自己的 Go 库的优点:

  1. 复用性:当在多个项目中需要使用相同的功能时,可以将这些功能封装在一个库中,然后在需要的地方引用他。这样可以避免重复编写相同的代码,提高编程效率。
  2. 可维护性:当需要修改某个功能时,只需修改对应的库,而不需要在多个地方进行修改,这样可以使代码更易于理解和维护。
  3. 可测试性:为每个库编写单元测试,确保他们的功能正确。修改代码时,可以运行这些测试来检查是否引入了新的错误。

接下来,将以 Asiatz(github.com/mazeyqian/asiatz)为例,详细演示如何创建一个规范的 Go 库。

Asiatz 主要功能是进行时区转换,特别是对亚洲时区的处理,他能够将各种时区转换为 UTC 时间。

utcTime, err := asiatz.ShanghaiToUTC("08:00")
if err != nil {// handle error
}
fmt.Println(utcTime) // Output: 00:00

第 1 步:创建目录

在本地创建一个新的目录,名为 asiatz。这个目录将包含所有的源代码、测试和文档文件。

mkdir asiatz
cd asiatz

第 2 步:初始化项目

2.1 初始化 Go 模块

asiatz 目录下,运行 go mod init <domain>/<username>/<module-name> 来初始化 Go 模块。

go mod init github.com/mazeyqian/asiatz

项目结构:

asiatz
└── go.mod

2.2 创建文件

创建一个新的 Go 文件,名为 asiatz.go。在此文件中,定义一个名为 asiatz 的包,并编写相对应的功能函数。

项目结构:

asiatz
├── asiatz.go
└── go.mod

代码示例:

package asiatzimport ("fmt""strconv"
)// ToUTC converts a time string (HH:mm) from a specified timezone to UTC time string (HH:mm).
func ToUTC(timezoneOffset float64, time string) (string, error) {hour, err := strconv.Atoi(time[:2])if err != nil {return "", err}minute, err := strconv.Atoi(time[3:])if err != nil {return "", err}totalMinutes := hour*60 + minuteutcTotalMinutes := ((totalMinutes-int(timezoneOffset*60))%1440 + 1440) % 1440utcHour := utcTotalMinutes / 60utcMinute := utcTotalMinutes % 60utcTime := fmt.Sprintf("%02d:%02d", utcHour, utcMinute)return utcTime, nil
}// ShanghaiToUTC converts a Shanghai time string (HH:mm) to UTC time string (HH:mm).
// For example, "08:00" in Shanghai is equivalent to "00:00" in UTC.
func ShanghaiToUTC(shanghaiTime string) (string, error) {return ToUTC(8, shanghaiTime)
}

第 3 步:编写测试

Go 提供了内置的测试框架,可以方便地编写和运行测试用例,以确保代码的正确性和稳定性。

asiatz 目录下创建一个新的 Go 文件,名为 asiatz_test.go。在这个文件中编写测试用例来测试 asiatz.go 中的函数。

项目结构:

asiatz
├── asiatz.go
├── asiatz_test.go
└── go.mod

代码示例:

package asiatzimport "testing"type testConversion struct {time     stringexpected string
}var tests = map[string][]testConversion{"Shanghai": {{"01:00", "17:00"},{"23:59", "15:59"},},// Others
}func runConversionTests(t *testing.T, tests []testConversion, conversionFunc func(string) (string, error)) {for _, test := range tests {actual, err := conversionFunc(test.time)if err != nil {t.Errorf("Unexpected error for %s: %v", test.time, err)continue}if actual != test.expected {t.Errorf("Expected %s for %s but got %s", test.expected, test.time, actual)}}
}func TestAllConversions(t *testing.T) {for timezone, tests := range tests {t.Run(timezone, func(t *testing.T) {switch timezone {case "Shanghai":runConversionTests(t, tests, ShanghaiToUTC)// Othersdefault:t.Errorf("Unexpected timezone %s", timezone)}})}
}

查看完整的用例可见:github.com/mazeyqian/asiatz/blob/main/asiatz_test.go

在当前目录下运行 go test 查看结果:

PASS
ok      github.com/mazeyqian/asiatz     0.449s

第 4 步:编写文档

为了方便其他人理解和使用 Asiatz 库,需要编写相应的使用文档。文档应包括库的目的、功能函数的用法、使用示例和注意事项等。

asiatz 目录下,创建一个新的 README.md 文件,并在其中编写文档。

项目结构:

asiatz
├── asiatz.go
├── asiatz_test.go
├── go.mod
└── README.md

文档示例:

文档示例

第 5 步:发布

5.1 上传

上传到 GitHub

将 Asiatz 库上传到 GitHub 或其他代码托管平台,使其他人可以方便地获取和使用。

go get github.com/mazeyqian/asiatz

5.2 版本控制

标签

在 Git 仓库上,还可以使用标签来管理库的不同版本。

git tag v1.0.0
git push origin v1.0.0

例如 Asiatz 目前有四个版本:v1.0.0v1.1.0v1.1.1v1.1.2,分别可以用以下命令获取:

go get github.com/mazeyqian/asiatz@v1.0.0
go get github.com/mazeyqian/asiatz@v1.1.0
go get github.com/mazeyqian/asiatz@v1.1.1
go get github.com/mazeyqian/asiatz@v1.1.2

第 6 步:在真实项目中使用

以 Go 项目 github.com/mazeyqian/go-gin-gee 为例,首先在项目目录(go-gin-gee)下运行命令 go get github.com/mazeyqian/asiatz 获取 Asiatz 库,然后引入使用即可:

// https://github.com/mazeyqian/go-gin-gee/blob/main/internal/api/controllers/schedules-controller.go
package controllersimport ("log""github.com/mazeyqian/asiatz"
)func Check() {// ...utcTime, err := asiatz.ShanghaiToUTC("10:00")if err != nil {// handle error}log.Println("UTC Time:", utcTime) // Output: 02:00// ...
}

总结

本文以 Asiatz 库为例,详细演示了如何从零开始创建、测试并发布自己的 Go 库。无论是新手,还是有经验的开发者;动手实践,开发并发布自己的库,不仅可以提高代码的复用性和维护性,提高自己的技能,还可以为社区做出贡献。

版权声明

本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者后除和本文原始地址:https://blog.mazey.net/4150.html

(完)

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

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

相关文章

C#中LINQtoSQL只能在.NetFramework下使用,不能在.net 下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点&#xff0c;因为我百般努力在.net7.0下无法实现LINQtoSQL的…

【异常错误】Multiple top-level packages discovered in a flat-layout: [

今天在配置环境时&#xff0c;在运行代码&#xff1a; pip install -e . 出现了以下错误&#xff1a; 解决方案 在setup.py中显示加入一行 py_modules[]&#xff0c;如&#xff1a; setup(namexxxx,versionx.x,py_modules[], ) 再次运行pip指令安装即可解决。 error: Mul…

分析报告有样板了-奥威BI数据可视化报表模板

述职报告、月度数据分析报告、季度数据分析报告、区域数据分析报告……人在职场&#xff0c;数据分析报告少不了。那么&#xff0c;怎么才能在极短的时间内做出一张既好看又突出重点、分析逻辑在线的数据可视化分析报表&#xff1f;奥威BI软件的建议是采用BI数据可视化报表模板…

香港金融科技周2023:AIGC重塑金融形态

10月31日&#xff0c;由香港财经事务及库务局与投资推广署主办的“香港金融科技周2023大湾区专场”盛大启幕。中国AI决策领先企业萨摩耶云科技集团创始人、董事长兼 CEO林建明受邀参加圆桌会议&#xff0c;与中国内地、香港以及全球金融科技行业顶尖人才、创新企业、监管机构和…

20.7 OpenSSL 套接字SSL加密传输

OpenSSL 中的 SSL 加密是通过 SSL/TLS 协议来实现的。SSL/TLS 是一种安全通信协议&#xff0c;可以保障通信双方之间的通信安全性和数据完整性。在 SSL/TLS 协议中&#xff0c;加密算法是其中最核心的组成部分之一&#xff0c;SSL可以使用各类加密算法进行密钥协商&#xff0c;…

04-附注 三维空间中的线性变换

附注 三维空间中的线性变换 三维空间线性变换 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 三维空间线性变换 图1 绕y轴旋转90 绕y轴旋转90后&#xff0c;各基向量所在的坐标如图1所示。用旋转后的各基向量作为矩阵的列&#xff0c;就得到变换矩阵。变换矩阵…

Redis4 渐进式遍历/自定义客户端/持久化

1.渐进式遍历 1.keys *一次性把所有的key都获取到.但是存在一个问题,一旦数据过多,redis就会被阻塞住,就无暇顾及其他的命令,这样的影响很大. 2.那么就出现了渐进式遍历,可以做到既能获取所有的key,又不会阻塞服务器.渐进式不是一个命令把所有的key获取到,而是没执行一次命令只…

Pyhotn: Mac安装selenium没有chromedriver-114以上及chromedriver无法挪到/usr/bin目录下的问题

1.0 安装selenium 终端输入&#xff1a; pip install selenium 查看版本&#xff1a; pip show selenium2.0 安装chromedriver 查看chrome版本 网上大多数是&#xff0c;基本到114就停了。 https://registry.npmmirror.com/binary.html?pathchromedriver/ 各种搜索&#…

使用 ChatGPT 提升 LeetCode 刷题效率

文章目录 1 背景2 操作步骤 1 背景 在做 LeetCode 的 SQL 题库时, 想在本地调试, 需要在本地的数据库上创建表以及准备测试数据, 大家都是有经验的开发人员, 简单粗暴的办法就不讲了 可以借助 ChatGPT 的能力, 生产数据库的表以及测试数据的 sql, 提升刷题效率 2 操作步骤 将…

【MySQL】数据库MySQL基础知识与操作

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

【PyTorch 卷积】实战自定义的图片归类

前言 卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络&#xff0c;是深度学习的代表算法之一&#xff0c;它通过卷积层、池化层、全连接层等结构&#xff0c;可以有效地处理如时间序列和图片数据等。关于卷积的概念网络上也比较多&#xff0c;这里就不一一描述了。…

加密解密基础知识Crypto Basics

base64编码 编码不是真正的密码学&#xff0c;但它在围绕加密功能的各种标准中被大量使用。尤其是 Base64 编码。 Base64 编码是一种用于将各种字节转换为特定字节范围的技术。此特定范围是 ASCII 可读字节。 这样&#xff0c;您可以更轻松地传输二进制数据&#xff0c;例如密…