前言
在 PHP 转 Go 的经历中,我个人感觉 Go 语言其实无论是在语言层面的内容,还是基础语言的用法,对于我们这些有着编程经验的 Phper 来说都“不是事”。无非是在 PHP 转 Go 的过程中,加强对编程意识的转变,重点关注 Go 语言相对 PHP 语言的几点差异:强类型、面向对象编程的模式、并发和协程(gorouting)的场景使用……但是,对于这些“不是事”的事之外,我对 PHP 的强大的内置函数还是比较“想”的,有时候同样的功能实现 PHP 只需要一个函数就可以是实现,你说我又怎么能不想啊?尤其对 Array 函数是“恋恋不忘”啊~
下载 & 安装
// github
go get github.com/lihao1988/php2go
// gitee
go get gitee.com/lihao1988/php2go
比如:计算字符串 MD5 加密逻辑
Go 语言实现:
package main
import (
"crypto/md5"
"fmt"
"io"
)
func Md5(str string) string {
data :=md5.Sum([]byte(str))
// 将 []byte 转换为 32字符十六进制数
return fmt.Sprintf("%x", data)
}
func main() {
fmt.Println(Md5("123456"))
}
PHP 内置函数:
echo md5("123456");
PHP 中的函数是如此强大和便捷,因此,作为从 Phper 转变而来的 Gopher ,又怎么能不对这些常用的函数“恋恋不忘”啊?而在 GitHub 中有很多类似的库,专门提供和 PHP 类似的 Go 函数。
在自我使用的驱动下,我也是实现部分常用函数的封装,并已发布了自己的 go module 包。
开源package包相关URL:
pkg.go.dev: https://pkg.go.dev/github.com/lihao1988/php2go
github: https://github.com/lihao1988/php2go
gitee: https://gitee.com/lihao1988/php2go
在开源代码中,基本实现了 PHP 语言中常用的部分函数,主要有 Array 函数、file 函数、math 函数、URL 函数、Crypto 函数和 String 函数。其中 Array 函数,在考虑Go 语言在强类型时,如何按照 PHP 内置 Array 函数来直接按数据类型实现的话,显然其要实现的函数其实过多,且使用极其不方便。在参考 Go 语言中 Json 解析的业务逻辑实现后,通过使用 reflect 模式实现其单一函数接受和返回各类类型数据,具体使用如下逻辑实现:
array 函数 - array_column
Go封装函数:Column(dest, input interface{}, columnKey, indexKey string)
实例一:key 使用子数组字段 'value',column 为子数组内容
// 实例一 - map
dataMap := []map[string]string{
{"key": "a", "value": "A"},
{"key": "b", "value": "B"},
}
dest := map[string]map[string]string{}
Column(&dest, dataMap, "", "value")
fmt.Println(dest)
// 输出结果 - dest
map[A:map[key:a value:A] B:map[key:b value:B]]
实例二:key 使用子数组字段 'value',column 使用子数组字段 'key'
// 实例二 - map
dataMap := map[string]map[string]string{
"a": {"key": "a", "value": "A"},
"b": {"key": "b", "value": "B"},
}
dest := map[string]string{}
Column(&dest, dataMap, "key", "value")
fmt.Println(dest)
// 输出结果 - dest
map[A:a B:b]
实例三:key 使用 struck 字段 'value',column 使用 struck 内容
// 实例三 - List
type PubKeyValue struct {
Key string
Value string
}
dataMap := []PubKeyValue{
{Key: "a", Value: "A"},
{Key: "b", Value: "B"},
}
dest := map[string]PubKeyValue{}
Column(&dest, dataMap, "", "Value")
fmt.Println(dest)
// 输出结果 - dest
map[A:{a A} B:{b B}]
Go 语言实现的 PHP 内置函数函数
Array(Slice/Map) Functions
## import array
In() [PHP:in_array(),检查数组中是否存在指定的值]
Keys() [PHP:array_keys(),返回数组中所有的键名]
Values() [PHP:array_values(),返回数组中所有的值]
Merge() [PHP:array_merge(),把一个或多个数组合并为一个数组]
Unique() [PHP:array_unique(),删除数组中的重复值]
Column() [PHP:array_column(),返回输入数组中某个单一列的值]
Diff() [PHP:array_diff(),比较数组,返回差集(只比较键值)]
Intersect() [PHP:array_intersect(),比较数组,返回交集(只比较键值)]
Crypto Functions
## import crypto
MD5() [PHP:md5(),计算字符串的 MD5 散列]
Sha1() [PHP:sha1(),计算字符串的 SHA-1 散列]
Base64Encode() [PHP:base64_encode(),使用 base64 对数据进行编码]
Base64Decode() [PHP:base64_decode(),对使用 base64 编码的数据进行解码]
Date/Time Functions
## import datetime
Time() [PHP:time(),返回当前时间的 Unix 时间戳]
StrToTime() [PHP:strtotime(),将任何英文文本的日期或时间描述解析为 Unix 时间戳]
Date() [PHP:date(),格式化本地日期和时间]
CheckDate() [PHP:checkdate(),验证日期格式的合法性]
Sleep() [PHP:sleep(),延迟代码执行若干秒]
Usleep() [PHP:usleep(),延迟代码执行若干微秒]
Filesystem Functions
## import file
Basename() [PHP:basename(),返回路径中的文件名部分]
Dirname() [PHP:dirname(),返回路径中的目录名称部分]
Filesize() [PHP:filesize(),返回文件大小]
PathInfo() [PHP:pathinfo(),返回关于文件路径的信息]
FileExists() [PHP:file_exists(),检查文件或目录是否存在]
IsDir() [PHP:is_dir(),判断文件是否是一个目录]
IsFile() [PHP:is_file(),判断文件是否是常规的文件]
FileGetContents() [PHP:file_get_contents(),把文件读入字符串]
FilePutContents() [PHP:file_put_contents(),把字符串写入文件]
Chmod() [PHP:chmod(),改变文件模式]
Chown() [PHP:chown(),改变文件所有者]
Math Functions
## import math
Abs() [PHP:abs(),绝对值]
Round() [PHP:round(),对浮点数进行四舍五入]
Floor() [PHP:floor(),向下舍入为最接近的整数]
Ceil() [PHP:ceil(),向上舍入为最接近的整数]
Max() [PHP:max(),返回最大值]
Min() [PHP:min(),返回最小值]
DecBin() [PHP:decbin(),把十进制转换为二进制]
DecHex() [PHP:dechex(),把十进制转换为十六进制]
String Functions
## import string
StrLen() [PHP:strlen(),获取字符串长度]
MbStrLen() [PHP:mb_strlen(),按照 UTF-8 获取字符串的长度]
SubstrCount() [PHP:substr_count(),计算字串出现的次数]
Substr() [PHP:substr(),返回字符串的子串]
MbSubstr() [PHP:mb_substr(),获取部分字符串]
StrPos() [PHP:strpos(),查找字符串首次出现的位置]
StrRPos() [PHP:strrpos(),计算指定字符串在目标字符串中最后一次出现的位置]
StrSplit() [PHP:str_split(),将字符串转换为数组]
UCFirst() [PHP:ucfirst(),将字符串的首字母转换为大写]
URL Functions
## import url
ParseUrl() [PHP:parse_url(),解析 URL,返回其组成部分]
UrlEncode() [PHP:urlencode(),编码 URL 字符串]
UrlDecode() [PHP:urldecode(),解码已编码的 URL 字符串]
RawUrlEncode() [PHP:rawurlencode(),按照 RFC 3986 对 URL 进行编码]
RawUrlDecode() [PHP:rawurldecode(),对已编码的 URL 字符串进行解码]
HttpBuildQuery() [PHP:http_build_query(),生成 URL-encode 之后的请求字符串]
其上函数均已实现,后期也会持续更新内容,让 PHPer 蜕变为 Gopher 更简单、更快捷!