Go語言和Java相同,支持多種數據類型,只是相對於Java來講,有些數據類型發生了些許的變化。在Go中主要有整數類型、複數類型、數組類型、切片類型、字典類型和結構體類型。這幾種類型與Java的對比整理如下:
類型名稱 | Go | Java |
---|---|---|
整數類型 | 10種整數類型 | 4種 |
複數類型 | complx64/complex128 | 無 |
數組類型 | 與Java基本一致 | 與Go基本沒有差別 |
字典類型 | 本質上,字典類型是map的一種實現,用於存儲鍵值對的無序組合。 | 相當於Java中的map |
結構體類型 | 關鍵字爲struct,形如: p:= struct{ Name string, Age uint8} | 相當於Java中的實體構建 |
切片類型 | 與數組類似,可以理解成對數組的切分操作 | 無 |
備註 | 在Go中聲名類型時,首字母消息,比如Java中的String在Go中表示爲string |
接下來我們從更細的力度來了解一下Go語言。
▶ 整數類型
從上面表格中我們瞭解到,在Go的整數類型中共有十種,在這十種整數類型中,我們可以分爲與計算架構相關和不相關兩個類別。與計算架構相關的分別是有符合的整數類型int和無符號的整數類別unint。
如下圖所示,在不同的計算架構的計算機上,這兩種類型體現的寬度是不同的,也就是說存儲這一類型的值所需要的空間是不一樣的。
另外八種與計算架構無關的類型,它們的寬度已經直接體現在類型名稱中了:
但需要注意的是,在Go中進行數據類型之間的比較時,需要根據當前數據類型的範圍進行適當的比較,比如Index變量是int型時,如果在程序中直接對index變量進行減一的結果進行比對,會發現永遠不會成立;在這種情況下與Java區別的本質是整數數據類型的區分。
▶ 浮點數和複數
在Go語言中,有兩種浮點類型(float32,float64)和兩種複數類型(complex64,complex128),而兩種複數類型分別由float32和float64來完成的。比如,complex64類型的值會由兩個float32類型的值來分別表示複數的實數部分和虛數部分。而complex128類型的值會由兩個float64類型的值分別表示複數的實數部分和虛數部分。
複數類型的值一般由浮點數表示的實數部分和“+”、浮點數表示的虛數部分以及小寫字母“i”組成。比如3.7E+1+5。98E-2i。關於複數的表示法代碼如下:
package main
import (
"fmt"
)
func main() {
var num3 = 3.7E+1 + 5.98E-2i
// 這裏用到了字符串格式化函數。其中,%E用於以帶指數部分的表示法顯示浮點數類型值,%f用於以通常的方法顯示浮點數類型值。
fmt.Printf("浮點數 %E 表示的是 %f。\n", num3, (37.000000+0.059800i))
}
▶ 數組類型
在Go中的數組類型,與Java中的差別不大,所以這裏不再贅述;
▶ 切片類型
與Java相比,在Go中特有的切片類型,與數組類似,都是可以容納若干類型相同的元素的容器,但是與數組不同的是,我們無法通過切片類型來確定其值得長度;切片類型的變量表示爲[]類型{值},比如[]int{1,2,3}。在切片類型中包含一種切片操作:
var numbers3 = [5]int{1, 2, 3, 4, 5}
var slice1 = numbers3[1:4]
在上述代碼中,number3[1,4]被稱爲切片表達式,個人理解,這個切片操作類似於對數組的截取。在切片類型中,下標索引從0開始。在該表達式中,切片表達式的求值結果相當於以元素下界索引和元素上界索引作爲依據從被操作對象上“切下”而形成的新值【1爲下界索引,4爲上界索引】。但在切片的操作中,“切下”的結果不包含上界索引指向的數據,所以slice1的結果爲{2,3,4}。
當然我們也可以對切片繼續進行切片操作,var slice2 = slice1[1:3],此時slice2的結果爲{3,4},PS:作爲切片表達式中的求值結果中切片值得長度也就是結果中的數據個數,總是元素上界索引和下界索引的差值。
在切片類型中,切片值以及數組值都還有另外一個屬性---容量,數組值的容量總是等於其長度,而切片值的容量則往往與其長度不同。
如上圖所示,一個切片值的容量就是它第一個元素值在其底層數組中的索引值與該數組長度差值的絕對值。當然,我們可以使用cap函數來獲取數組、切片或通道類型(稍後會講到)的值的容量:
var capacity2 int = cap(slice2)
要注意,切片類型屬於引用類型,它的零值就是nil,也就是我們所說的空值。如果我們只聲明瞭一個變量而沒有賦值,那麼這個變量的值是nil,就像是在Java中我們只聲明變量,未初始化時爲null是一個道理。由於篇幅原因,數據類型先到這裏,通道和字典類型會在下篇博文中繼續講述!