Php2Go - 用 golang 實(shí)現(xiàn) php 常用內(nèi)置函數(shù)

前言

????在 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)單极祸、更快捷!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怠晴,一起剝皮案震驚了整個(gè)濱河市遥金,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌龄寞,老刑警劉巖汰规,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異物邑,居然都是意外死亡溜哮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門色解,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茂嗓,“玉大人,你說我怎么就攤上這事科阎∈鑫” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵锣笨,是天一觀的道長(zhǎng)蝌矛。 經(jīng)常有香客問我,道長(zhǎng)错英,這世上最難降的妖魔是什么入撒? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮椭岩,結(jié)果婚禮上茅逮,老公的妹妹穿的比我還像新娘。我一直安慰自己判哥,他們只是感情好献雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塌计,像睡著了一般挺身。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锌仅,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天瞒渠,我揣著相機(jī)與錄音良蒸,去河邊找鬼。 笑死伍玖,一個(gè)胖子當(dāng)著我的面吹牛嫩痰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窍箍,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼串纺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了椰棘?” 一聲冷哼從身側(cè)響起纺棺,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邪狞,沒想到半個(gè)月后祷蝌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帆卓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年巨朦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑令。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糊啡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吁津,到底是詐尸還是另有隱情棚蓄,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布碍脏,位于F島的核電站梭依,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏典尾。R本人自食惡果不足惜睛挚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望急黎。 院中可真熱鬧,春花似錦侧到、人聲如沸勃教。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽故源。三九已至,卻和暖如春汞贸,著一層夾襖步出監(jiān)牢的瞬間绳军,已是汗流浹背印机。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留门驾,地道東北人射赛。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奶是,于是被迫代替她去往敵國(guó)和親楣责。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Gox語言不僅包含了大部分Go語言的標(biāo)準(zhǔn)庫對(duì)象聂沙,以及很多常用的第三方庫秆麸,還提供了很多簡(jiǎn)潔實(shí)用的內(nèi)置函數(shù)。常用的內(nèi)置...
    陸滿庭閱讀 1,029評(píng)論 0 3
  • 前言 本靜態(tài)站點(diǎn)用于演示之用及汉,使用 Hugo 構(gòu)建沮趣,以及 Markdown 供應(yīng)內(nèi)容。 流行的靜態(tài)站點(diǎn)框架有以下幾...
    堅(jiān)果jimbowhy閱讀 1,605評(píng)論 0 0
  • 什么叫可變坷随。在程序世界中房铭,可變的當(dāng)然是變量。常量在定義之后都是不可變的甸箱,在程序執(zhí)行過程中育叁,這個(gè)常量都是不能修改的。...
    ZyBlog閱讀 197評(píng)論 0 0
  • 有事沒事芍殖,看看 PHP[http://php.net/]豪嗽,新語言特性總是不斷出現(xiàn),函數(shù)實(shí)現(xiàn)也總有新發(fā)現(xiàn)豌骏;在引入 L...
    michael_jia閱讀 435評(píng)論 0 0
  • 在所有的編程語言中龟梦,方法或者函數(shù),都可以傳遞一些參數(shù)進(jìn)來進(jìn)行業(yè)務(wù)邏輯的處理或者計(jì)算窃躲。這沒什么可說的计贰,但是在PHP中...
    ZyBlog閱讀 276評(píng)論 0 1