PHP轉(zhuǎn)Go之基礎(chǔ)數(shù)據(jù)類型對(duì)比詳解
本文主要講解Go中基礎(chǔ)數(shù)據(jù)類型,字符串、整數(shù)、浮點(diǎn)數(shù)、布爾這幾個(gè)類型,像slice、map、struct等類型會(huì)有單獨(dú)文章講解
本文概要
- 1、要轉(zhuǎn)換思維,盡可能的不再定義弱類型,比如Go里的interface{}
- 2、務(wù)必要注意強(qiáng)類型里的默認(rèn)值
一、基礎(chǔ)類型對(duì)比
我們?cè)诤芏辔恼轮卸寄芸吹筋愃频恼f明,這里copy一份,僅供參考
語言\類型 | boolean | string | int | float | array |
---|---|---|---|---|---|
PHP | bool | string | int | float | [1,2,3]/["a"=>1] |
Go | bool | string | int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64 | float32、float64 | slice/map |
二、認(rèn)知和使用差異點(diǎn)
對(duì)于強(qiáng)類型語言只有類型相同的值才能夠比較
<?php $a = 1; $b = "1"; $c = true; var_dump($a == $b); var_dump($b == $c); var_dump($a == $c); // Output,當(dāng)然php也支持強(qiáng)類型的判等比較 === bool(true) bool(true) bool(true)
package main import "fmt" func main() { a := int32(1) b := int64(2) if a == b { // 這一行直接報(bào)錯(cuò),根本無法編譯過去 fmt.Println("相等") } }
變量必須聲明并初始化
在PHP中可以隨時(shí)聲明一個(gè)變量并賦予任意類型的任意值,這在Go中是行不通的,在強(qiáng)類型語言中,必須要提前聲明變量類型,當(dāng)然可以顯示的聲明,也可以是推導(dǎo)式的聲明,并且Go中的所有類型都是有默認(rèn)值的
package main import "fmt" func main() { var a string // 默認(rèn)空字符串 var b int // 所有int都默認(rèn)0 var c float64 // 所有float64都默認(rèn)0 d := false // 推導(dǎo)出d是布爾值,bool值默認(rèn)false fmt.Println(a, b, c, d) // b = "1" // 這種賦值會(huì)直接報(bào)錯(cuò) } // Output, 需注意string默認(rèn)值為空字符串,所以未能有效輸出展示 0 0 false
protobuf中也會(huì)利用默認(rèn)值的特性,不傳遞變量是默認(rèn)值的數(shù)據(jù),減少傳輸數(shù)據(jù)量
如何做類型轉(zhuǎn)換
PHP中可以利用(int)
,(string)
等方式直接完成類型強(qiáng)轉(zhuǎn),且不會(huì)報(bào)錯(cuò),但是Go中就略顯繁瑣,不同的類型轉(zhuǎn)到同一個(gè)類型可能使用的方法不同,比如:
package main import ( "fmt" "strconv" ) func main() { a := "1" b := 1.0 var c interface{} c = "2" d, _ := strconv.Atoi(a) f, _ := strconv.Atoi(c.(string)) fmt.Println(int(b)) // int和float之間可以直接轉(zhuǎn)換,但是要注意范圍溢出的問題 fmt.Println(d, f) // 字符串轉(zhuǎn)數(shù)字需要使用特定函數(shù),還要注意錯(cuò)誤 fmt.Printf("%d %.1f", bb, b) // 其他類型轉(zhuǎn)字符串,使用格式化字符串函數(shù),最簡單直觀 }
Go中使用類型轉(zhuǎn)換最流行的一個(gè)庫就是 spf13/cast 庫了,強(qiáng)烈建議直接引用,不要自己造輪子,需要注意的是 cast 庫避免了 panic,所以在很多轉(zhuǎn)換過程中,對(duì)于失敗的案例,返回值就變成了變量默認(rèn)值,這個(gè)需要看下自己業(yè)務(wù)場景是否正常
Unicode字符處理
在php中,Unicode字符聲明時(shí)并無特殊,而僅僅是在處理時(shí),需要使用一些列以 mb_
開頭的函數(shù)
<?php $a = "我愛中國"; echo "字節(jié)長度:", strlen($a),"字符串長度:", mb_strlen($a); // output: 字節(jié)長度:12字符串長度:4
而在Go中,Unicode對(duì)應(yīng)的是一個(gè)類型 rune
,而其各種操作函數(shù)跟之前沒有區(qū)別 string 背后實(shí)際利用 []byte
or []rune
實(shí)現(xiàn),所以可以無縫互轉(zhuǎn)
package main import "fmt" func main() { str := "我愛中國" fmt.Println("len", len(str), len([]rune(str))) fmt.Println(string([]rune(str)[1:])) // 如果這里不轉(zhuǎn)為[]rune,則處理unicode字符時(shí)會(huì)出現(xiàn)亂碼 } // Output len 12 4 愛中國
三、基礎(chǔ)類型使用中的常見坑
1.json轉(zhuǎn)換失敗,引起異常
這里核心講下類型引起的異常,其實(shí)強(qiáng)語言與js這種弱類型交互處理json坑真的很多
- "1" 和 1 是完全不同的類型,golang無法解析"1"為 1, 因類型不對(duì)應(yīng),直接報(bào)錯(cuò)
{"key":null}
注意對(duì)于null,golang在解析時(shí)會(huì)解析成對(duì)應(yīng)key聲明的類型的默認(rèn)值,而不一定是 nil- 不要忽略
json.Unmarshal
的報(bào)錯(cuò),某個(gè)字段無法解析報(bào)錯(cuò)時(shí),可能會(huì)導(dǎo)致結(jié)構(gòu)體內(nèi)都是默認(rèn)值,引起異常 - 使用
json.Unmarshal
或者json.Marshal
時(shí),對(duì)于結(jié)構(gòu)體中的小字字母開頭的變量,處理時(shí)是忽略的,這個(gè)也可能會(huì)導(dǎo)致與預(yù)期不一致
json的處理值得寫一篇單獨(dú)文章來講解,這里許個(gè)諾,稍后期待補(bǔ)充
2.float的精度問題
Golang中同樣有浮點(diǎn)數(shù)精度問題的坑
package main import ( "fmt" "math/big" ) func main() { f := 0.6 ff := 0.7 fmt.Println(f + ff) a, _ := new(big.Float).SetString("0.6") b, _ := new(big.Float).SetString("0.7") // 加法運(yùn)算 cccc := new(big.Float).Add(a, b) fmt.Println("Add:", cccc.String()) } // Output Add: 1.2999999999999998 Add: 1.3
可見對(duì)于高精度需求的計(jì)算時(shí)這還是有點(diǎn)問題的,Golang自帶的math包可以有效的解決這個(gè)問題,另外推薦第三方庫https://github.com/shopspring/decimal也能很好的解決這個(gè)問題,使用起來可能更方便一點(diǎn)~
到此這篇關(guān)于PHP轉(zhuǎn)Go之基礎(chǔ)數(shù)據(jù)類型對(duì)比詳解的文章就介紹到這了,更多相關(guān)PHP轉(zhuǎn)Go內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Fatal error: session_start(): Failed to initialize storage m
這篇文章主要介紹了Fatal error: session_start(): Failed to initialize storage module: files問題解決方法,需要的朋友可以參考下2014-05-05rephactor 優(yōu)秀的PHP的重構(gòu)工具
從PHP5開始,提供了強(qiáng)大的面向?qū)ο蠊δ?。使得PHP能夠完全按設(shè)計(jì)模式編程。2011-06-06PHP針對(duì)偽靜態(tài)的注入總結(jié)【附asp與Python相關(guān)代碼】
這篇文章主要介紹了PHP針對(duì)偽靜態(tài)的注入,結(jié)合實(shí)例形式總結(jié)分析了php針對(duì)偽靜態(tài)的常見注入情況,并附帶asp與Python的相關(guān)操作代碼,對(duì)于php程序安全有一定借鑒價(jià)值,需要的朋友可以參考下2017-08-08PHP+HTML實(shí)現(xiàn)流式輸出效果的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何使用PHP+HTML實(shí)現(xiàn)流式輸出效果的相關(guān)方法,即仿DeepSeek等對(duì)話式AI效果,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04php獲取從百度、谷歌等搜索引擎進(jìn)入網(wǎng)站關(guān)鍵詞的方法
這篇文章主要介紹了php獲取從百度、谷歌等搜索引擎進(jìn)入網(wǎng)站關(guān)鍵詞的方法,可實(shí)現(xiàn)判斷進(jìn)入網(wǎng)站的搜索引擎來源及搜索的關(guān)鍵詞功能,非常簡單實(shí)用,需要的朋友可以參考下2015-07-07php實(shí)現(xiàn)圖片轉(zhuǎn)換成ASCII碼的方法
這篇文章主要介紹了php實(shí)現(xiàn)圖片轉(zhuǎn)換成ASCII碼的方法,涉及php操作圖片的技巧,需要的朋友可以參考下2015-04-04PHP新手用的Insert和Update語句構(gòu)造類
PHP新手用的Insert和Update語句構(gòu)造類,沒多大功能,學(xué)習(xí)php的朋友可以參考下2012-03-03