大家好,我是码农先森。

从 PHP 转到 Go 的朋友,常常会因为没有便捷的工具函数而感到苦恼。PHP 写的多了就会形成路径依赖,在写 Go 的时候时不时就会想到 PHP 强大的数组函数。当然写 Go 的 PHPer 也想拥有这么强大的工具函数,在这个开源的编程世界总有一些伟大的程序员做着贡献,正是有了他们的存在,因此便有了 lancet 这样一个强大的 Go 语言工具函数库,下面我介绍一些常用的工具函数「文末附上了手册地址」。

ContainChinese 验证字符串是否包含中文字符。

import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
) func main() {
result1 := validator.ContainChinese("你好")
result2 := validator.ContainChinese("你好hello")
result3 := validator.ContainChinese("hello") fmt.Println(result1)
fmt.Println(result2)
fmt.Println(result3) // Output:
// true
// true
// false
}

IsChineseMobile 验证字符串是否是中国手机号码。

import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
) func main() {
result1 := validator.IsChineseMobile("13263527980")
result2 := validator.IsChineseMobile("434324324") fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

IsChineseIdNum 验证字符串是否是中国身份证号码。

import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
) func main() {
result1 := validator.IsChineseIdNum("210911192105130715")
result2 := validator.IsChineseIdNum("123456") fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

IsChinesePhone 验证字符串是否是中国电话座机号码。

import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
) func main() {
result1 := validator.IsChinesePhone("010-32116675")
result2 := validator.IsChinesePhone("123-87562") fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

IsCreditCard 验证字符串是否是信用卡号码。

import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
) func main() {
result1 := validator.IsCreditCard("4111111111111111")
result2 := validator.IsCreditCard("123456") fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

IsEmail 验证字符串是否是有效电子邮件地址。

import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
) func main() {
result1 := validator.IsEmail("abc@xyz.com")
result2 := validator.IsEmail("a.b@@com") fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

Contain 判断 slice 是否包含 value。

import (
"fmt"
"github.com/duke-git/lancet/v2/slice"
) func main() {
result1 := slice.Contain([]string{"a", "b", "c"}, "a")
result2 := slice.Contain([]int{1, 2, 3}, 4) fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

Chunk 按照 size 参数均分 slice。

import (
"fmt"
"github.com/duke-git/lancet/v2/slice"
) func main() {
arr := []string{"a", "b", "c", "d", "e"} result1 := slice.Chunk(arr, 1)
result2 := slice.Chunk(arr, 2) fmt.Println(result1)
fmt.Println(result2) // Output:
// [[a] [b] [c] [d] [e]]
// [[a b] [c d] [e]]
}

Equal 检查两个切片是否相等,相等条件:切片长度相同,元素顺序和值都相同。

import (
"fmt"
"github.com/duke-git/lancet/v2/slice"
) func main() {
s1 := []int{1, 2, 3}
s2 := []int{1, 2, 3}
s3 := []int{1, 3, 2} result1 := slice.Equal(s1, s2)
result2 := slice.Equal(s1, s3) fmt.Println(result1)
fmt.Println(result2) // Output:
// true
// false
}

Comma 用逗号每隔3位分割数字/字符串,支持前缀添加符号。参数 value 必须是数字或者可以转为数字的字符串, 否则返回空字符串。

package main

import (
"fmt"
"github.com/duke-git/lancet/v2/formatter"
) func main() {
result1 := formatter.Comma("123", "")
result2 := formatter.Comma("12345", "$")
result3 := formatter.Comma(1234567, "¥") fmt.Println(result1)
fmt.Println(result2)
fmt.Println(result3) // Output:
// 123
// $12,345
// ¥1,234,567
}

ForEach 对 map 中的每对 key和 value 执行 iteratee 函数。

package main

import (
"fmt"
"github.com/duke-git/lancet/v2/maputil"
) func main() {
m := map[string]int{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
} var sum int maputil.ForEach(m, func(_ string, value int) {
sum += value
}) fmt.Println(sum) // Output:
// 10
}

Keys 返回 map 中所有 key 的切片。

package main

import (
"fmt"
"github.com/duke-git/lancet/v2/maputil"
) func main() {
m := map[int]string{
1: "a",
2: "a",
3: "b",
4: "c",
5: "d",
} keys := maputil.Keys(m)
sort.Ints(keys) fmt.Println(keys) // Output:
// [1 2 3 4 5]
}

Merge 合并多个 maps 相同的 key 会被后来的 key 覆盖。

package main

import (
"fmt"
"github.com/duke-git/lancet/v2/maputil"
) func main() {
m1 := map[int]string{
1: "a",
2: "b",
}
m2 := map[int]string{
1: "1",
3: "2",
} result := maputil.Merge(m1, m2) fmt.Println(result) // Output:
// map[1:c 2:b 3:d]
}

RandInt 生成随机int, 范围[min, max)。

package main

import (
"fmt"
"github.com/duke-git/lancet/v2/random"
) func main() {
rInt := random.RandInt(1, 10)
fmt.Println(rInt)
}

RandString 生成给定长度的随机字符串,只包含字母(a-zA-Z)。

package main

import (
"fmt"
"github.com/duke-git/lancet/v2/random"
) func main() {
randStr := random.RandString(6)
fmt.Println(randStr) //pGWsze
}

以上这些只是部分的工具函数,如果想查看所有内容可以访问 https://www.golancet.cn/ 该网站。

再强大的函数工具库也不可能涵盖所有的场景,随着现在 AI 的盛行,AI 的编程辅助工具也应运而生。在这里我再分享一个免费的 PHP 代码直接转换 Go 代码工具,这个工具简直是 PHP 程序员的福音,直接将 PHP 代码贴上便自动生成了 Go 代码。

最后附上这个 AI 工具的地址 https://www.codeconvert.ai/php-to-golang-converter 赶快去使用吧。


欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

PHP转Go系列 | 推荐一个强大的Go语言工具函数库的更多相关文章

  1. 极力推荐一个简单好用的C++JSON库

      极力推荐一个简单好用的C++JSON库CJsonObject,让使用json如使用C++原生的结构体那般方便,随心所欲.CJsonObject是个优秀的C++JSON库,也许会是你见过的最为简单易 ...

  2. 推荐一个sqlce,sqllite等数据库管理工具

    推荐一个sqlce,sqllite等数据库管理工具 下载地址: http://fishcodelib.com/files/DatabaseNet4.zip 支持sqlserver,sqlce, sql ...

  3. 推荐一个百度网盘搜索工具www.sososo.me

    推荐一个百度网盘搜索工具 http://www.sososo.me

  4. 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

    毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...

  5. Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils

    排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...

  6. ABP(现代ASP.NET样板开发框架)系列之21、ABP展现层——Javascript函数库

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project ...

  7. 推荐一个Dapper扩展CRUD基本操作的开源库

    在C#众多ORM框架中,Dapper绝对称得上微型ORM之王,Dapper以灵活.性能好而著名,同样也是支持各种数据库,但是对于一些复杂的查询,我们写原生的SQL语句问题不大,对于CRUD基本操作,我 ...

  8. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

  9. 推荐一个 HTML5在线的流程图工具——ProcessOn

    一直想找个简单好用的UML建模工具,无意在茫茫百度中看见了网友推荐的N多工具,从中找了一个叫 ProcessOn 的工具,可以说非常棒.如果我是WEB开发人员,我肯定去深入研究HTML5啦,太令人着迷 ...

  10. fiddler -- 一个强大的抓包工具

    一.fiddler常用功能: 1. Fiddler 是位于客户端和服务器端的http代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有http请求,可以针对特定的http请 ...

随机推荐

  1. go语言开发的内网穿透工具,frp.

    转载自:https://www.appinn.com/frp/ 什么是 Frp? 内网穿透工具有很多,其中 Frp (Fast Reverse Proxy) 是比较流行的一款.FRP 是一个免费开源的 ...

  2. 【web】自定义协议Protocol URL

    URL Protocol(自定义协议)可以让web页面调用本地exe程序,这个神奇的功能是怎么实现的呢? URL ProtocolURL Protocol,没错就是标题里所说的自定义协议.这玩意儿大家 ...

  3. NOIP模拟60

    T1 整除 解题思路 答案就是 n 的每一个质因数的合法的答案数相乘(证明的话就....) 但是复杂度显然不允许(虽然我们可以给指数取模水过去).. 可以用积性筛(线性筛)利用质数筛出 \(x^m\) ...

  4. 8.13考试总结(NOIP模拟38)[a·b·c]

    重要的不是你做了多少事,而是你放了多少心思进去. T1 a 解题思路 总结一下,是双指针运用不够熟练(zxb笑了笑). 其实这个题是可以用树状数组卡过的(众所周知我是一个正直的人),但是一定是要打正解 ...

  5. cors解决跨域 服务器代理方式

    // cors 方法         // 后端程序员通过定义后端程序,让跨域访问,可以正常执行,可以获取响应体内容         // 前端程序员不需要做任何的调整         // 后端程序 ...

  6. LeetCode 683. K Empty Slots K 个空花盆 / LintCode 861. K个空的位置 (C++/Java)

    题目: 一个花园有N个位置.每个位置上有一朵花.这N朵花会在N天内逐一盛开.每天都一定会有并且只有一朵花盛开,从这天起,这朵花将一直处于盛开的状态. 给定一个由数字1到N组成的数组flowers.数组 ...

  7. 【Java面试题-基础知识02】Java抽象类和接口六连问?

    1.抽象类和接口分别是什么? 抽象类是一种类,可以包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,需要在子类中被具体实现. 接口是一种完全抽象的类,其中的所有方法都是抽象方法,没有方法体,它只 ...

  8. LVGL8文本框设置长文本会自动滚动到文本最后解决方法

    在创建完成并设置完文本之后加一句 lv_obj_scroll_to_y(obj,0, LV_ANIM_OFF); 就可以了 原因:官方控件里面设置文本的接口里面设置文本后会设置一次光标位置到文本末尾, ...

  9. reids分片技术cluster篇

    为什么学redis-cluster 前面两篇文章,主从复制和哨兵机制保障了高可用 就读写分离,而言虽然slave节点扩展了主从的读并发能力 但是写能力和存储能力是无法进行扩展,就只能是master节点 ...

  10. Prometheus + Grafana (1) 监控

    简介 Micrometer/Prometheus/Grafana体系是当前最成熟的低成本Java监控解决方案,而且通过其他的Prometheus exporter,还可以进行诸如我们可能需要的Wind ...