前言
????在 PHP 轉(zhuǎn) Go 的經(jīng)歷中综苔,我個(gè)人感覺 Go 語言其實(shí)無論是在語言層面的內(nèi)容圃阳,還是基礎(chǔ)語言的用法紊撕,對(duì)于我們這些有著編程經(jīng)驗(yàn)的 Phper 來說都“不是事”蜡歹。無非是在 PHP 轉(zhuǎn) Go 的過程中,加強(qiáng)對(duì)編程意識(shí)的轉(zhuǎn)變薯鳍,重點(diǎn)關(guān)注 Go 語言相對(duì) PHP 語言的幾點(diǎn)差異:強(qiáng)類型咖气、面向?qū)ο缶幊痰哪J健⒉l(fā)和協(xié)程(gorouting)的場(chǎng)景使用……但是挖滤,對(duì)于這些“不是事”的事之外崩溪,我對(duì) PHP 的強(qiáng)大的內(nèi)置函數(shù)還是比較“想”的,有時(shí)候同樣的功能實(shí)現(xiàn) PHP 只需要一個(gè)函數(shù)就可以是實(shí)現(xiàn)斩松,你說我又怎么能不想傲嫖ā?尤其對(duì) Array 函數(shù)是“戀戀不忘”啊~
下載 & 安裝
// github
go get github.com/lihao1988/php2go
// gitee
go get gitee.com/lihao1988/php2go
比如:計(jì)算字符串 MD5 加密邏輯
Go 語言實(shí)現(xiàn):
package main
import (
"crypto/md5"
"fmt"
"io"
)
func Md5(str string) string {
data :=md5.Sum([]byte(str))
// 將 []byte 轉(zhuǎn)換為 32字符十六進(jìn)制數(shù)
return fmt.Sprintf("%x", data)
}
func main() {
fmt.Println(Md5("123456"))
}
PHP 內(nèi)置函數(shù):
echo md5("123456");
????PHP 中的函數(shù)是如此強(qiáng)大和便捷惧盹,因此乳幸,作為從 Phper 轉(zhuǎn)變而來的 Gopher ,又怎么能不對(duì)這些常用的函數(shù)“戀戀不忘”熬粹断?而在 GitHub 中有很多類似的庫,專門提供和 PHP 類似的 Go 函數(shù)嫡霞。
在自我使用的驅(qū)動(dòng)下姿染,我也是實(shí)現(xiàn)部分常用函數(shù)的封裝,并已發(fā)布了自己的 go module 包秒际。
開源package包相關(guān)URL:
pkg.go.dev: https://pkg.go.dev/github.com/lihao1988/php2go
github: https://github.com/lihao1988/php2go
gitee: https://gitee.com/lihao1988/php2go
????在開源代碼中,基本實(shí)現(xiàn)了 PHP 語言中常用的部分函數(shù)狡汉,主要有 Array 函數(shù)娄徊、file 函數(shù)、math 函數(shù)盾戴、URL 函數(shù)寄锐、Crypto 函數(shù)和 String 函數(shù)。其中 Array 函數(shù)尖啡,在考慮Go 語言在強(qiáng)類型時(shí)橄仆,如何按照 PHP 內(nèi)置 Array 函數(shù)來直接按數(shù)據(jù)類型實(shí)現(xiàn)的話,顯然其要實(shí)現(xiàn)的函數(shù)其實(shí)過多衅斩,且使用極其不方便盆顾。在參考 Go 語言中 Json 解析的業(yè)務(wù)邏輯實(shí)現(xiàn)后,通過使用 reflect 模式實(shí)現(xiàn)其單一函數(shù)接受和返回各類類型數(shù)據(jù)畏梆,具體使用如下邏輯實(shí)現(xiàn):
array 函數(shù) - array_column
Go封裝函數(shù):Column(dest, input interface{}, columnKey, indexKey string)
實(shí)例一:key 使用子數(shù)組字段 'value'您宪,column 為子數(shù)組內(nèi)容
// 實(shí)例一 - 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)
// 輸出結(jié)果 - dest
map[A:map[key:a value:A] B:map[key:b value:B]]
實(shí)例二:key 使用子數(shù)組字段 'value'奈懒,column 使用子數(shù)組字段 'key'
// 實(shí)例二 - 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)
// 輸出結(jié)果 - dest
map[A:a B:b]
實(shí)例三:key 使用 struck 字段 'value',column 使用 struck 內(nèi)容
// 實(shí)例三 - 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)
// 輸出結(jié)果 - dest
map[A:{a A} B:{b B}]
Go 語言實(shí)現(xiàn)的 PHP 內(nèi)置函數(shù)函數(shù)
Array(Slice/Map) Functions
## import array
In() [PHP:in_array(),檢查數(shù)組中是否存在指定的值]
Keys() [PHP:array_keys(),返回?cái)?shù)組中所有的鍵名]
Values() [PHP:array_values(),返回?cái)?shù)組中所有的值]
Merge() [PHP:array_merge(),把一個(gè)或多個(gè)數(shù)組合并為一個(gè)數(shù)組]
Unique() [PHP:array_unique(),刪除數(shù)組中的重復(fù)值]
Column() [PHP:array_column(),返回輸入數(shù)組中某個(gè)單一列的值]
Diff() [PHP:array_diff(),比較數(shù)組,返回差集(只比較鍵值)]
Intersect() [PHP:array_intersect(),比較數(shù)組宪巨,返回交集(只比較鍵值)]
Crypto Functions
## import crypto
MD5() [PHP:md5(),計(jì)算字符串的 MD5 散列]
Sha1() [PHP:sha1(),計(jì)算字符串的 SHA-1 散列]
Base64Encode() [PHP:base64_encode(),使用 base64 對(duì)數(shù)據(jù)進(jìn)行編碼]
Base64Decode() [PHP:base64_decode(),對(duì)使用 base64 編碼的數(shù)據(jù)進(jìn)行解碼]
Date/Time Functions
## import datetime
Time() [PHP:time(),返回當(dāng)前時(shí)間的 Unix 時(shí)間戳]
StrToTime() [PHP:strtotime(),將任何英文文本的日期或時(shí)間描述解析為 Unix 時(shí)間戳]
Date() [PHP:date(),格式化本地日期和時(shí)間]
CheckDate() [PHP:checkdate(),驗(yàn)證日期格式的合法性]
Sleep() [PHP:sleep(),延遲代碼執(zhí)行若干秒]
Usleep() [PHP:usleep(),延遲代碼執(zhí)行若干微秒]
Filesystem Functions
## import file
Basename() [PHP:basename(),返回路徑中的文件名部分]
Dirname() [PHP:dirname(),返回路徑中的目錄名稱部分]
Filesize() [PHP:filesize(),返回文件大小]
PathInfo() [PHP:pathinfo(),返回關(guān)于文件路徑的信息]
FileExists() [PHP:file_exists(),檢查文件或目錄是否存在]
IsDir() [PHP:is_dir(),判斷文件是否是一個(gè)目錄]
IsFile() [PHP:is_file(),判斷文件是否是常規(guī)的文件]
FileGetContents() [PHP:file_get_contents(),把文件讀入字符串]
FilePutContents() [PHP:file_put_contents(),把字符串寫入文件]
Chmod() [PHP:chmod(),改變文件模式]
Chown() [PHP:chown(),改變文件所有者]
Math Functions
## import math
Abs() [PHP:abs(),絕對(duì)值]
Round() [PHP:round(),對(duì)浮點(diǎn)數(shù)進(jìn)行四舍五入]
Floor() [PHP:floor(),向下舍入為最接近的整數(shù)]
Ceil() [PHP:ceil(),向上舍入為最接近的整數(shù)]
Max() [PHP:max(),返回最大值]
Min() [PHP:min(),返回最小值]
DecBin() [PHP:decbin(),把十進(jìn)制轉(zhuǎn)換為二進(jìn)制]
DecHex() [PHP:dechex(),把十進(jìn)制轉(zhuǎn)換為十六進(jìn)制]
String Functions
## import string
StrLen() [PHP:strlen(),獲取字符串長(zhǎng)度]
MbStrLen() [PHP:mb_strlen(),按照 UTF-8 獲取字符串的長(zhǎng)度]
SubstrCount() [PHP:substr_count(),計(jì)算字串出現(xiàn)的次數(shù)]
Substr() [PHP:substr(),返回字符串的子串]
MbSubstr() [PHP:mb_substr(),獲取部分字符串]
StrPos() [PHP:strpos(),查找字符串首次出現(xiàn)的位置]
StrRPos() [PHP:strrpos(),計(jì)算指定字符串在目標(biāo)字符串中最后一次出現(xiàn)的位置]
StrSplit() [PHP:str_split(),將字符串轉(zhuǎn)換為數(shù)組]
UCFirst() [PHP:ucfirst(),將字符串的首字母轉(zhuǎn)換為大寫]
URL Functions
## import url
ParseUrl() [PHP:parse_url(),解析 URL磷杏,返回其組成部分]
UrlEncode() [PHP:urlencode(),編碼 URL 字符串]
UrlDecode() [PHP:urldecode(),解碼已編碼的 URL 字符串]
RawUrlEncode() [PHP:rawurlencode(),按照 RFC 3986 對(duì) URL 進(jìn)行編碼]
RawUrlDecode() [PHP:rawurldecode(),對(duì)已編碼的 URL 字符串進(jìn)行解碼]
HttpBuildQuery() [PHP:http_build_query(),生成 URL-encode 之后的請(qǐng)求字符串]
其上函數(shù)均已實(shí)現(xiàn),后期也會(huì)持續(xù)更新內(nèi)容捏卓,讓 PHPer 蛻變?yōu)?Gopher 更簡(jiǎn)單极祸、更快捷!