最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP轉Go之基礎數(shù)據(jù)類型對比詳解

 更新時間:2023年09月17日 11:22:12   作者:全Neng攻城獅  
這篇文章主要為大家詳細介紹了PHP與Go語言中基礎數(shù)據(jù)類型的對比,以及使用時常見的坑,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下

本文主要講解Go中基礎數(shù)據(jù)類型,字符串、整數(shù)、浮點數(shù)、布爾這幾個類型,像slice、map、struct等類型會有單獨文章講解

本文概要

  • 1、要轉換思維,盡可能的不再定義弱類型,比如Go里的interface{}
  • 2、務必要注意強類型里的默認值

一、基礎類型對比

我們在很多文章中都能看到類似的說明,這里copy一份,僅供參考

語言\類型booleanstringintfloatarray
PHPboolstringintfloat[1,2,3]/["a"=>1]
Goboolstringint、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64float32、float64slice/map

二、認知和使用差異點

對于強類型語言只有類型相同的值才能夠比較

<?php
$a = 1;
$b = "1";
$c = true;
var_dump($a == $b);
var_dump($b == $c);
var_dump($a == $c);
// Output,當然php也支持強類型的判等比較 ===
bool(true)
bool(true)
bool(true)
package main
import "fmt"
func main() {
	a := int32(1)
	b := int64(2)
	if a == b { // 這一行直接報錯,根本無法編譯過去
		fmt.Println("相等")
	}
}

變量必須聲明并初始化

在PHP中可以隨時聲明一個變量并賦予任意類型的任意值,這在Go中是行不通的,在強類型語言中,必須要提前聲明變量類型,當然可以顯示的聲明,也可以是推導式的聲明,并且Go中的所有類型都是有默認值的

package main
import "fmt"
func main() {
	var a string // 默認空字符串
	var b int // 所有int都默認0
	var c float64 // 所有float64都默認0
	d := false // 推導出d是布爾值,bool值默認false
	fmt.Println(a, b, c, d)
   // b = "1" // 這種賦值會直接報錯
}
// Output, 需注意string默認值為空字符串,所以未能有效輸出展示
0 0 false

protobuf中也會利用默認值的特性,不傳遞變量是默認值的數(shù)據(jù),減少傳輸數(shù)據(jù)量

如何做類型轉換

PHP中可以利用(int),(string)等方式直接完成類型強轉,且不會報錯,但是Go中就略顯繁瑣,不同的類型轉到同一個類型可能使用的方法不同,比如:

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之間可以直接轉換,但是要注意范圍溢出的問題
	fmt.Println(d, f)   // 字符串轉數(shù)字需要使用特定函數(shù),還要注意錯誤
   fmt.Printf("%d %.1f", bb, b) // 其他類型轉字符串,使用格式化字符串函數(shù),最簡單直觀
}

Go中使用類型轉換最流行的一個庫就是 spf13/cast 庫了,強烈建議直接引用,不要自己造輪子,需要注意的是 cast 庫避免了 panic,所以在很多轉換過程中,對于失敗的案例,返回值就變成了變量默認值,這個需要看下自己業(yè)務場景是否正常

Unicode字符處理

在php中,Unicode字符聲明時并無特殊,而僅僅是在處理時,需要使用一些列以 mb_開頭的函數(shù)

<?php
$a = "我愛中國";
echo "字節(jié)長度:", strlen($a),"字符串長度:", mb_strlen($a);
// output: 字節(jié)長度:12字符串長度:4

而在Go中,Unicode對應的是一個類型 rune,而其各種操作函數(shù)跟之前沒有區(qū)別 string 背后實際利用 []byte or []rune 實現(xiàn),所以可以無縫互轉

package main
import "fmt"
func main() {
	str := "我愛中國"
	fmt.Println("len", len(str), len([]rune(str)))
	fmt.Println(string([]rune(str)[1:])) // 如果這里不轉為[]rune,則處理unicode字符時會出現(xiàn)亂碼
}
// Output
len 12 4
愛中國

三、基礎類型使用中的常見坑

1.json轉換失敗,引起異常

這里核心講下類型引起的異常,其實強語言與js這種弱類型交互處理json坑真的很多

  • "1" 和 1 是完全不同的類型,golang無法解析"1"為 1, 因類型不對應,直接報錯
  • {"key":null} 注意對于null,golang在解析時會解析成對應key聲明的類型的默認值,而不一定是 nil
  • 不要忽略 json.Unmarshal 的報錯,某個字段無法解析報錯時,可能會導致結構體內都是默認值,引起異常
  • 使用 json.Unmarshal 或者 json.Marshal時,對于結構體中的小字字母開頭的變量,處理時是忽略的,這個也可能會導致與預期不一致

json的處理值得寫一篇單獨文章來講解,這里許個諾,稍后期待補充

2.float的精度問題

Golang中同樣有浮點數(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")
	// 加法運算
	cccc := new(big.Float).Add(a, b)
	fmt.Println("Add:", cccc.String())
}
// Output
Add: 1.2999999999999998
Add: 1.3

可見對于高精度需求的計算時這還是有點問題的,Golang自帶的math包可以有效的解決這個問題,另外推薦第三方庫https://github.com/shopspring/decimal也能很好的解決這個問題,使用起來可能更方便一點~

到此這篇關于PHP轉Go之基礎數(shù)據(jù)類型對比詳解的文章就介紹到這了,更多相關PHP轉Go內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • PHP初學者最感迷茫的問題小結

    PHP初學者最感迷茫的問題小結

    列出了所有初學者最感迷茫的PHP問題,學習php的朋友可以參考下。
    2010-03-03
  • php多層數(shù)組與對象的轉換實例代碼

    php多層數(shù)組與對象的轉換實例代碼

    通過json_decode(json_encode($object)可以將對象一次性轉換為數(shù)組,但是object中遇到非utf-8編碼的非ascii字符則會出現(xiàn)問題,比如gbk的中文,何況json_encode和decode的性能也值得疑慮
    2013-08-08
  • thinkphp5.0自定義驗證規(guī)則使用方法

    thinkphp5.0自定義驗證規(guī)則使用方法

    本文主要講了thinkphp5.0版本中自定義驗證規(guī)則的使用方法和一些注意事項。
    2017-11-11
  • 關于在php.ini中添加extension=php_mysqli.dll指令的說明

    關于在php.ini中添加extension=php_mysqli.dll指令的說明

    關于在php.ini中添加extension=php_mysqli.dll指令的說明...
    2007-06-06
  • 比file_get_contents穩(wěn)定的curl_get_contents分享

    比file_get_contents穩(wěn)定的curl_get_contents分享

    相信使用過file_get_contents函數(shù)的朋友都知道,當獲取的$url訪問不了時,會導致頁面漫長的等待,甚至還能導致PHP進程占用CPU達100%,因此這個函數(shù)就誕生了
    2012-01-01
  • Swoole 4.x服務器Server配置和函數(shù)列表

    Swoole 4.x服務器Server配置和函數(shù)列表

    Swoole是一個使用C++語言編寫的基于異步事件驅動和協(xié)程的并行網(wǎng)絡通信引擎,為PHP提供協(xié)程、高性能網(wǎng)絡編程支持,使用同步風格實現(xiàn)異步程序
    本文總結了Swoole 4.x服務器預定義常量、Server配置選項、Server函數(shù)列表、Server屬性列表、事件回調函數(shù)
    2024-11-11
  • PHP中非常有用卻鮮有人知的函數(shù)集錦

    PHP中非常有用卻鮮有人知的函數(shù)集錦

    這篇文章主要介紹了PHP中非常有用卻鮮有人知的函數(shù),結合實例形式總結分析了PHP中l(wèi)evenshtein、get_defined_vars、php_check_syntax、ignore_user_abort、highlight_string、highlight_file、get_browser等函數(shù)使用方法,需要的朋友可以參考下
    2019-08-08
  • 什么情況下可以不寫PHP的閉合標簽“?>”

    什么情況下可以不寫PHP的閉合標簽“?>”

    這篇文章主要介紹了什么情況下可以不寫PHP的閉合標簽“?>”,是進行PHP程序開發(fā)需要特別注意的地方,需要的朋友可以參考下
    2014-08-08
  • PHP 中魔術常量的實例詳解

    PHP 中魔術常量的實例詳解

    這篇文章主要介紹了PHP 中魔術常量的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解這部分內容,需要的朋友可以參考下
    2017-10-10
  • PHP+MYSQL會員系統(tǒng)的開發(fā)實例教程

    PHP+MYSQL會員系統(tǒng)的開發(fā)實例教程

    這篇文章主要介紹了PHP+MYSQL會員系統(tǒng)的開發(fā)實例教程,通過一個完整的會員系統(tǒng)開發(fā),進一步加深對PHP+MySQL程序設計流程的認識,需要的朋友可以參考下
    2014-08-08

最新評論

桐乡市| 遂平县| 明溪县| 黔南| 双江| 都匀市| 昭平县| 邵阳市| 修武县| 马关县| 浑源县| 湟源县| 雷州市| 博客| 通州市| 呼图壁县| 张家港市| 分宜县| 赣州市| 吉水县| 日土县| 应城市| 阆中市| 甘肃省| 神木县| 琼海市| 融水| 长治县| 大厂| 南宫市| 西贡区| 科技| 沙田区| 墨脱县| 运城市| 汾西县| 贵南县| 铜陵市| 吉木萨尔县| 罗平县| 贺州市|