Php2Go - 用 golang 实现 php 常用内置函数

前言

    在 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 更简单、更快捷!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容