写点什么

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:151115

评论

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

自定义HarmonyOS启动页组件

白晓明

HarmonyOS 自定义组件 OpenHarmony

OceanBase 4.0解读:兼顾高效与透明,我们对DDL的设计与思考

OceanBase 数据库

数据库 oceanbase

HIFIVE音加加×筷子科技,内容创作如何再加“筷”一点

曲多多(嗨翻屋)版权音乐

音乐 版权 视频创作 AI剪辑

# drainer binlog 清理机制 源码详解

TiDB 社区干货传送门

集群管理 管理与运维

云数据库TiDB使用过程注意项及改进建议

TiDB 社区干货传送门

6.x 实践

高复用性自动化脚本设计实践

京东科技开发者

自动化 测试 框架 脚本重构 高复用

LeetCode题解:938. 二叉搜索树的范围和,DFS,详细注释

Lee Chen

算法 LeetCode

借助 APISIX Ingress,实现与注册中心的无缝集成

API7.ai 技术团队

服务注册与发现 服务发现 APISIX Ingress Controller

TiDB在转转公司的发展历程

TiDB 社区干货传送门

实践案例 版本升级 集群管理 管理与运维

2022年最新数据库调查报告:当前企业使用率第一的中国数据库是什么?

墨天轮

数据库 TiDB oceanbase 国产数据库 达梦数据

谈JVM参数GC线程数ParallelGCThreads合理性设置

京东科技开发者

线程 JVM cpu GC线程 ParallelGCThreads

Slurm集群调度策略详解(2)-回填调度

慕冰

Slurm 回填调度

设计模式第七讲-外观模式、适配器模式、模板方法模式详解

C++后台开发

设计模式 后端开发 Linux服务器开发 适配器模式 C++开发

理论+实践,揭秘昇腾CANN算子开发

华为云开发者联盟

人工智能 AI 华为云 企业号 2 月 PK 榜 华为云开发者联盟

普通单双面板的生产工艺流程:图形转移

华秋电子

信通院发布“2023可信AI案例 知识计算应用优秀案例”, 百度知识中台三大案例入选

极客天地

【2.10-2.17】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

基于 Flink 的小米数据集成实践

Apache Flink

大数据 flink 实时计算

ChatGPT搜索风暴

OneFlow

人工智能 深度学习

文盘Rust -- 本地库引发的依赖冲突

TiDB 社区干货传送门

开发语言

火山引擎DataTester:A/B测试,让企业摆脱广告投放“乱烧钱”

字节跳动数据平台

大数据 AB testing实战 企业号 2 月 PK 榜

Wallys|QCN9074/QCN6024/ 5G 802.11ax|Does QCN9074-5G module support W56?

Cindy-wallys

QCN9074 QCN6024

拜占庭将军问题和 Raft 共识算法讲解

京东科技开发者

算法 分布式系统 拜占庭将军问题 raft共识算法 日志同步

@所有人,OceanBase DevCon • 2023来啦!

OceanBase 数据库

数据库 oceanbase

模块6 拆分电商系统为微服务

KING

GGX发布全新路线图,揭示具备 Layer0 特性且可编程的跨链基建生态

股市老人

【立哥】【每日一个小知识】写遗嘱把部分财产赠给第三者,遗嘱有效力吗?

Lee Chen

知识

iOS tableView添加group分组

刿刀

ios UITableView

故障案例:MySQL唯一索引有重复值,官方却说This is not a bug

GreatSQL

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