
今天给大家介绍下我们自主开发的 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 exception
errno : 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/tmp
file 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 success
parse json file success
save parse json file k: k2 equal
save parse json file k: k3 equal
save 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 long
end too long
abcdefg 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:05
not 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
更多内容推荐
在线问题反馈模块实战 (六): 接口文档定义
在线问题反馈模块实战教学,等你来白嫖,非常详细,适合新手小白学习。
2022-10-20
Matlab 常用图像处理命令 108 例(五)
54.imcontour 55.imcrop 56.imfeature 57.imfinfo 58.imhist 59.immovie 60.imnoise 61.impixel 62.improfile 63.imread 64.imresize 65.imrotate
2023-03-15
Mediabox:年度最佳音视频开发工具
Mediabox:年度最佳音视频开发工具
2023-07-19
C++ 使用 getline() 从文件中读取一行字符串
我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。
后端2023-01-08:小红定义一个仅有 r、e、d 三种字符的字符串中, 如果仅有一个长度不小于 2 的回文子串,那么这个字符串定义为“好串“。 给定一个正整数 n,输出长度为 n 的好串有多少个。 结果对 10^9
2023-01-08:小红定义一个仅有r、e、d三种字符的字符串中,如果仅有一个长度不小于2的回文子串,那么这个字符串定义为"好串"。给定一个正整数n,输出长度为n的好串有多少个。结果对10 ^ 9 + 7取模, 1 <= n <= 10^9。示例:n = 1, 输出0,n = 2, 输出3,n =
2023-01-08
29. 代码实现 portal 页 (1)
2023-09-30
如何从 0 到 1 做一款向量数据库 | InfoQ《极客有约》
本期《极客有约》我们和Zilliz 合伙人兼技术总监栾小凡聊聊如何从0到1做一款向量数据库。
开箱即用的对话机器人解决方案,涵盖问答型对话、任务型对话和聊天型对话等多种场景,为您提供全方位的对话交互体验
开箱即用的对话机器人解决方案,涵盖问答型对话、任务型对话和聊天型对话等多种场景,为您提供全方位的对话交互体验
2023-08-13
第一财经《导师带回血三期必中》MBA 智库百科
导师带回血三期必中【龙导➕腾讯Q̴:6014073】✅ 罔:05cs.vip✅自带邀請碼✅ 实力带赚✅ 首存即送✅ 信誉实力老品牌✅加入我们只为下水的上岸,岸上的拼搏,一期迈进美好的生活有梦想就去追,不尝试你永远不知道你的潜力有多大 最重要还是要找对一个能引领
2023-09-04
兆骑科创创新创业大赛,双创活动,赛事承办,三招三引
兆骑科创创新创业大赛,双创活动,赛事承办,三招三引
2022-08-17
26. 消息存储的高效与刷盘策略
2023-09-29
【更新版】2. 架构设计前期应该怎么做
2023-09-26
用友 iuap 让企业数智化能力深入、让业务价值浅出
过去的数字化转型,是以信息技术建设为主导,尽管是支撑业务,但并非完全以业务为驱动,以业务为中心;而未来,所有的数字化都要从业务视角出发,所有的数字系统都要围绕业务,企业数智化平台当然也不外如是。
2023-04-27
02. 懂战略 - 战略的定义
2023-10-17
前辈从业多年的心得分享 - 读《这就是软件工程师》
这本书一开始是从左耳朵耗子的推特上看到的出版消息,是耗子叔和郄小虎等几位前辈分享的各自从业多年的经验和心得,在书中得到的启发:
2023-09-08
第 15 讲 薪酬体系设计简易法(下)
2023-10-17
入门级教程:使用 Flask 进行 Python Web 开发
Flask 是一个轻量级的 Python Web 框架,它被广泛用于构建 Web 应用程序和 API。Flask 简单易用,具有灵活性和可扩展性,是许多开发者喜欢用其构建项目的原因。本文将介绍 Flask 是什么以及如何使用它来构建 Web 应用程序,同时提供一个实践案例,让你能够在
2023-08-04
SAP | 认识 abap 工作台(上)
ABAP工作台各个主要工具的概述
2022-10-14
Laravel 中 HasOne 和 BelongsTo 的区别
hasOne 和 belongsTo 是 Laravel中用于定义一对一关系的关系方法。
2022-12-20
第 15 集 如何建团队:制定 KPI 的标准
2023-10-17
推荐阅读
SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用
2023-11-21
18. 掌握销售沟通三板斧——听 问 说(下)
2023-10-17
文生图大型实践:揭秘百度搜索 AIGC 绘画工具的背后故事!
2023-11-08
15. 从例外管理到例行管理
2023-10-17
小间距 LED 显示屏的技术优势有哪些?
2023-10-20
18|错误处理系统:错误的构建、传递和处理
2023-11-29
技术筑生态智联赢未来, 第二届 OpenHarmony 技术大会圆满举行
2023-11-04
电子书

大厂实战PPT下载
换一换 
娄一翎 博士 | 复旦大学 计算机科学技术学院 青年副研究员
邬吉风 | 阿里巴巴 高级无线技术专家
申广宇 | 京东 资深研发工程师
评论