本文目錄一覽:
golang是什麼意思?
Go(又稱Golang)是Google的Robert Griesemer,Rob Pike及Ken Thompson開發的一種靜態強類型、編譯型語言。Go語言語法與C相近,但功能上有:內存安全,GC(垃圾回收),結構形態及CSP-style並發計算。
這可能是最全的golang的”==”比較規則了吧
大家經常用”==”來比較兩個變量是否相等。但是golang中的”==”有很多細節的地方,跟php是不一樣的。很多時候不能直接用”==”來比較,編譯器會直接報錯。
golang中基本類型的比較規則和複合類型的不一致,先介紹下golang的變量類型:
golang中的基本類型
比較的兩個變量類型必須相等。而且,golang沒有隱式類型轉換,比較的兩個變量必須類型完全一樣,類型別名也不行。如果要比較,先做類型轉換再比較。
複合類型是逐個字段,逐個元素比較的。需要注意的是, array 或者struct中每個元素必須要是可比較的,如果某個array的元素 or struct的成員不能比較(比如是後面介紹的slice,map等),則此複合類型也不能比較。
逐個成員比較類型和值。每個對應成員的比較遵循基本類型變量的比較規則。
但是如果struct中有不可比較的成員類型時:
可以看到,struct中有slice這種不可比較的成員時,整個struct都不能做比較,即使沒有對slice那個成員賦值(slice默認值為nil)
slice和map的比較規則比較奇怪,我們先說普通的變量引用類型val和channel的比較規則。
引用類型變量存儲的是某個變量的內存地址。所以引用類型變量的比較,判斷的是這兩個引用類型存儲的是不是同一個變量。
上面看起來比較廢話,但是得理解引用類型的含義。不然對判斷規則還是不清楚。
slice類型不可比較,只能與零值nil做比較。
關於slice類型不可比較的原因,後面會專門寫文章做討論。
map類型和slice一樣,不能比較,只能與nil做比較。
接口類型的變量,包含該接口變量存儲的值和值的類型兩部分組成,分別稱為接口的動態類型和動態值。 只有動態類型和動態值都相同時,兩個接口變量才相同:
而且接口的動態類型必須要是可比較的,如果不能比較(比如slice,map),則運行時會報panic。因為編譯器在編譯時無法獲取接口的動態類型,所以編譯能通過,但是運行時直接panic:
golang的func作為一等公民,也是一種類型,而且不可比較
上面說過,map和slice是不可比較類型,但是有沒有特殊的方法來對slice和map做比較呢,有
reflect.DeepEqual函數可以用來比較兩個任意類型的變量
對map類型做比較:
對slice類型做比較:
對struct類型做比較:
可以發現,只要變量的類型和值相同的話,reflect.DeepEqual比較的結果就為true
直接看用例:
結果為:
1, golang的類型再定義和類型別名
2,golang的slice和map為什麼不可以比較
1,
2,
3,
golang是什麼意思
Go語言(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種靜態強類型、編譯型語言。Go 語言語法與 C 相近,但功能上有:內存安全,GC(垃圾回收),結構形態及 CSP-style 並發計算。 擴展資料
Go語言主要用作服務器端開發,其定位是用來開發“大型軟件”的,適合於很多程序員一起開發大型軟件,並且開發周期長,支持雲計算的網絡服務。Go語言能夠讓程序員快速開發,並且在軟件不斷的’增長過程中,它能讓程序員更容易地進行維護和修改。它融合了傳統編譯型語言的高效性和腳本語言的易用性和富於表達性。
Go語言作為服務器編程語言,很適合處理日誌、數據打包、虛擬機處理、文件系統、分布式系統、數據庫代理等;網絡編程方面,Go語言廣泛應用於Web應用、API應用、下載應用等;除此之外,Go語言還可用於內存數據庫和雲平台領域,目前國外很多雲平台都是採用Go開發。
原創文章,作者:HCPV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/146531.html