写点什么

gobox 中的异常定义和杂项工具

  • 2019-11-18
  • 本文字数:2596 字

    阅读完需:约 9 分钟

gobox中的异常定义和杂项工具

今天给大家介绍下我们自主开发的 go 语言轻型框架 gobox,今天这一期,主要说下 gobox 中的异常定义和杂项工具。为什么叫 gobox 呢?因为我们设计让每一个单独的模块都作为一个 box,那这些 box 的集合就称为 gobox,再使用 go 的 pkg 管理机制引入到项目中。

exception

很多语言提供了异常机制,但是 go 没有,相似的能力可以用 panic/recover 来模拟,但是官方并不推荐这样做。


我们在系统中定义错误时通常需要错误码 errno 和错误信息 msg,这个包就是简单的包装了下这两个常用的错误内容。

用法示例

package main
import ( "github.com/goinbox/exception"
"fmt")
func main() { e := exception.New(101, "test exception")
fmt.Println(e.Errno(), e.Msg()) fmt.Println(e.Error())}
复制代码

输出效果示例

101 test exceptionerrno : 101 , msg : test exception
复制代码

gomisc

gomisc 提供了很多工具方法

slice 去重

这里仅对最常用的 int[]和 string[]提供了方法,示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt")
func main() { is := []int{1, 2, 2, 3, 3, 3, 4, 4, 4, 4} fmt.Println("origin slice is: ", is)
is = gomisc.IntSliceUnique(is) fmt.Println("after call slice is: ", is)
ss := []string{"a", "ab", "ab", "abc", "abc", "abc", "abcd", "abcd", "abcd", "abcd", "abcd"} fmt.Println("origin slice is: ", ss)
ss = gomisc.StringSliceUnique(ss) fmt.Println("after call slice is: ", ss)}
复制代码


结果输出:


origin slice is: [1 2 2 3 3 3 4 4 4 4]after call slice is: [1 2 3 4]origin slice is: [a ab ab abc abc abc abcd abcd abcd abcd abcd]after call slice is: [a ab abc abcd]
复制代码

检查文件或是目录是否存在

示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt")
func main() { f := "/etc/passwd"
r := gomisc.FileExist(f) if r { fmt.Println(f, "is exist") } else { fmt.Println(f, "is not exist") }
d := "/home/ligang/devspace"
r = gomisc.DirExist(d) if r { fmt.Println(d, "is exist") } else { fmt.Println(d, "is not exist") }}
复制代码


结果输出:


/etc/passwd is exist/home/ligang/devspace is exist
复制代码

[]byte 追加

示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt")
func main() { b := []byte("abc") b = gomisc.AppendBytes(b, []byte("def"), []byte("ghi"))
fmt.Println(string(b))}
复制代码


结果输出:


abcdefghi
复制代码


递归获取指定根目录下的所有文件,包括子目录


这里的实现,解决了目录过深时栈溢出的问题,示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt")
func main() { fileList, err := gomisc.ListFilesInDir("/home/ligang/tmp") if err != nil { fmt.Println(err) return }
for _, path := range fileList { fmt.Println(path) }}
复制代码


输出:


root dir is: /home/ligang/tmpfile list under root dir are:/home/ligang/tmp/misc/go1.10.2.linux-amd64.tar.gz/home/ligang/tmp/misc/CLion-2018.1.2.tar.gz/home/ligang/tmp/misc/docker-18.03.1-ce.tgz/home/ligang/tmp/go/main.go/home/ligang/tmp/go/.idea/modules.xml/home/ligang/tmp/go/.idea/workspace.xml/home/ligang/tmp/go/.idea/go.iml
复制代码

保存和解析 json 文件

示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt")
func main() { filePath := "/tmp/test_save_parse_json_file.json" v1 := make(map[string]string) v1["k1"] = "a" v1["k2"] = "b" v1["k3"] = "c" err := gomisc.SaveJsonFile(filePath, v1) if err != nil { fmt.Println("save json file failed: " + err.Error()) } else { fmt.Println("save json file success") } v2 := make(map[string]string) err = gomisc.ParseJsonFile(filePath, &v2) if err != nil { fmt.Println("parse json file failed: " + err.Error()) } else { fmt.Println("parse json file success") }
for k, v := range v2 { if v != v1[k] { fmt.Println("save parse json file error, k: " + k + " not equal") } else { fmt.Println("save parse json file k:", k, "equal") } }}
复制代码


输出:


save json file successparse json file successsave parse json file k: k2 equalsave parse json file k: k3 equalsave parse json file k: k1 equal
复制代码

字符串截取

示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt")
func main() { s := "abcdefg"
_, err := gomisc.SubString(s, 3, 20) fmt.Println(err)
_, err = gomisc.SubString(s, 10, 3) fmt.Println(err)
ss, _ := gomisc.SubString(s, 3, 4) fmt.Println(s, "substr", "3,4", "is", ss)}
复制代码


输出:


end too longend too longabcdefg substr 3,4 is defg
复制代码

时间格式化时的常量定义

TIME_FMT_STR_YEAR = "2006"TIME_FMT_STR_MONTH = "01"TIME_FMT_STR_DAY = "02"TIME_FMT_STR_HOUR = "15"TIME_FMT_STR_MINUTE = "04"TIME_FMT_STR_SECOND = "05"
复制代码

常用时间格式化时的格式

输出格式: yyyy-mm-dd h:i:s


示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt" "time")func main() { layout := gomisc.TimeGeneralLayout() fmt.Println("fmt layout is", layout)
fmt.Println("not time is", time.Now().Format(layout))}
复制代码


输出:


fmt layout is 2006-01-02 15:04:05not time is 2018-05-20 06:15:08
复制代码

通过时间生成随机数

示例:


package main
import ( "github.com/goinbox/gomisc"
"fmt" "time")
func main() { tm := time.Now() fmt.Println(gomisc.RandByTime(&tm), gomisc.RandByTime(&tm), gomisc.RandByTime(nil))}
复制代码


输出:


4423491624236117727 4423491624236117727 1471010178475409526
复制代码


这里请注意:时间值相同时运算结果是相同的。


欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/3YZm9BCzGgvRezne-ORLCA


2019-11-18 15:151117

评论

发布
暂无评论
发现更多内容

CAD怎么根据浮动范围选择圆

极客天地

【IoTDB 线上小课 14】我们为什么要做树表双模型?

Apache IoTDB

AI阅读眼动就翻页,领权益解锁HUAWEI Pura X内容新体验

最新动态

本周六,龙蜥社区邀您共赴第三届 eBPF 开发者大会

OpenAnolis小助手

操作系统 龙蜥社区 eBPF开发者大会

Anolis OS 8.10 发布:软硬协同优化,满足多行业实际应用需求

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥操作系统 Anolis OS

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合

阿里巴巴云原生

Java

虚拟化NFSoRDMA基础的分离式存储解决方案,用于AI工作负载

Sergey Platonov

性能测试 虚拟化 高性能计算, 高性能计算架构

Sentinel源码—ProcessorSlot的执行过程

电子尖叫食人鱼

Arthas watch (方法执行数据观测)

刘大猫

Arthas 图像处理 图像分割 光学成像 光电成像技术

基于TiDB的应用多活架构

陈一之

TiDB 多活容灾 应用多活

重大升级| SecGPT V2.0:打造真正“懂安全”的大模型

云起无垠

真正懂生产的工业智能体长啥样?一个评测告诉你答案

王吉伟频道

工业互联网 智能体 工业智能体 Agents 工业大模型

深度探讨操作系统运维、软件选型等社区标准,龙蜥标准化 SIG MeetUp 圆满举办

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥sig 标准化 SIG 龙蜥meetup

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

冴羽

前端 前端框架 React Svelte SvelteKit

让我看看有多少人不知道Vue3中也能实现高阶组件HOC

不在线第一只蜗牛

Java JavaScript 前端

如何与Cursor结对编程?

RockBot

AI技术实践 cursor

阿里云OSS应对DDoS攻击策略

网络安全服务

阿里云 CDN 域名解析 DDoS DDoS 攻击

龙蜥邀您参加 2025 全国大学生计算机系统能力大赛操作系统设计赛

OpenAnolis小助手

操作系统 开源大赛

通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等

阿里云云效

阿里云 云原生 通义灵码

云备份技术解析:云备份 CT-CBR 关键技术介绍

天翼云开发者社区

云备份

技术干货推荐:高效解决性能瓶颈与抖动之进程热点追踪

OpenAnolis小助手

操作系统 SysOM 操作系统控制台

数字先锋|文化传承新引擎:班智达科研项目云端腾飞!

天翼云开发者社区

云服务 教育数字化

通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等

阿里巴巴云原生

阿里云 云原生 通义灵码

Edge 浏览器推出 Copilot Vision:免费实时解析屏幕内容;Aqua Voice:极速 AI 语音输入工具丨日报

声网

京东3D空间视频生成技术探索与应用

京东零售技术

深入研究:微店商品详情API接口详解

tbapi

微店商品详情接口 微店API 微店数据采集

CAD如何放大图纸

极客天地

CAD怎么将实体转换为网格

极客天地

小白速进!30 天吃透低代码,全是超绝干货!

代码制造者

低代码 自学 无代码

StarRocks Community Monthly Newsletter (Mar)

StarRocks

OLAP 存算分离架构 StarRocks 湖仓一体 数据库 大数据

赋能能源 | 智慧数据,构建更高效智能的储能管理系统

KaiwuDB

数据库 kwdb

gobox中的异常定义和杂项工具_文化 & 方法_Agang_InfoQ精选文章