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

简介: 解释了为何需要开发自己的 Go 库,以及如何创建、测试和发布。文章以 Asiatz 库为例,详细阐述了创建目录、初始化项目、编写代码、测试、编写文档和发布等步骤,并强调了开发自己的 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 asiatz

import (
    "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 + minute
    utcTotalMinutes := ((totalMinutes-int(timezoneOffset*60))%1440 + 1440) % 1440
    utcHour := utcTotalMinutes / 60
    utcMinute := utcTotalMinutes % 60
    utcTime := 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 asiatz

import "testing"

type testConversion struct {
   
   
    time     string
    expected 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)
            // Others
            default:
                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 controllers

import (
    "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

(完)

目录
相关文章
|
1月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
56 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
17天前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
25天前
|
SQL 安全 Java
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
|
1月前
|
网络协议 Linux Go
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
|
3月前
|
人工智能 自然语言处理 前端开发
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
CodeArena 是一个在线平台,用于测试和比较不同大型语言模型(LLM)的编程能力。通过实时显示多个 LLM 的代码生成过程和结果,帮助开发者选择适合的 LLM,并推动 LLM 技术的发展。
112 7
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
|
4月前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####
|
4月前
|
算法 安全 程序员
Go语言的并发编程:深入理解与实践####
本文旨在探讨Go语言在并发编程方面的独特优势及其实现机制,通过实例解析关键概念如goroutine和channel,帮助开发者更高效地利用Go进行高性能软件开发。不同于传统的摘要概述,本文将以一个简短的故事开头,引出并发编程的重要性,随后详细阐述Go语言如何简化复杂并发任务的处理,最后通过实际案例展示其强大功能。 --- ###
|
4月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
106 4
|
4月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
78 1
|
4月前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
233 0

热门文章

最新文章