golang之數據結構


 

 

 

4種:bool/int/uint/uintptr(其中bool類型的零值為false,其余類型的零值為0)

4種:float32/float64/complex64/complex126 (零值為0)

8種:int8/int16/int32/int64/uint8/uint16u/int32/uint64 (零值為0)其中byte=int8,rune=int32,-----無符號數往往只有在位運算或其它特殊的運算場景才會使用,一般不用。

string:(零值為空字符串)

 復雜類型:

指針

數組

切片

哈希

結構體

函數

接口

channel

 --------------------------------------------------------------------

1、整型。 

          (1) byte與rune類型有一個共性,即:它們都屬於別名類型byte是uint8的別名類型,而rune則是int32的別名類型。byte類型的值需用8個比特位表示,其表示法與uint8類型無異。因此我們就不再這里贅述了。我們下面重點說說rune類型。  

         (2)一個rune類型的值即可表示一個Unicode字符。Unicode是一個可以表示世界范圍內的絕大部分字符的編碼規范。用於代表Unicode字符的編碼值也被稱為Unicode代碼點。一個Unicode代碼點通常由“U+”和一個以十六進制表示法表示的整數表示。例如,英文字母“A”的Unicode代碼點為“U+0041”。rune類型的值需要由單引號“'”包裹。例如,'A'或'郝'。這種表示方法一目了然。不過,我們還可以用另外幾種形式表示rune類型值。請看下表。   

          (3)另外,在rune類型值的表示中支持幾種特殊的字符序列,即:轉義符。它們由“\”和一個單個英文字符組成。如下表所示。

 

     (4)整數的表示:十進制、八進制(以0開頭)、十六進制(以0x開頭)。在數學中整數一般是以10進制來表示的,而在計算機中整數則必是以2進制來表示和存儲的。當然,在計算機科學領域,整數的表示形式還包括了8進制和16進制。

2浮點型

     (1)浮點數類型有兩個,即float32和float64。你可能已經想到,存儲這兩個類型的值的空間分別需要4個字節和8個字節。優先使用float64類型。
     (2)浮點數類型有兩種表示。一般由整數部分、小數點“.”和小數部分組成。其中,整數部分和小數部分均由10進制表示法表示。不過還有另一種表示方法。那就是在其中加入指數部分。指數部分由“E”或“e”以及一個帶正負號的10進制數組成。比如,3.7E-2表示浮點數0.037。又比如,3.7E+1表示浮點數37。有時候,浮點數類型值的表示也可以被簡化。比如,37.0可以被簡化為37。又比如,0.037可以被簡化為.037。
    (3)浮點數的相關部分只能由10進制表示法表示,而不能由8進制表示法或16進制表示法表示。比如,03.7表示的一定是浮點數3.7。

3、復數

           Go語言提供了兩種精度的復數類型:complex64和complex128,分別對應float32和float64兩種浮點數精度。內置的complex函數用於構建復數,內建的real和imag函數分別返回復數的實部和虛部:

var x complex128 = complex(1, 2) // 1+2i var y complex128 = complex(3, 4) // 3+4i fmt.Println(x*y) // "(-5+10i)" fmt.Println(real(x*y)) // "-5" fmt.Println(imag(x*y)) // "10" 

4、布爾類型

        一個布爾類型的值只有兩種:true和false。且bool類型的變量只能接受true、false和結果為布爾類型的表達式。

        if和for語句的條件部分都是布爾類型的值,並且==和<等比較操作也會產生布爾型的值。一元操作符!對應邏輯非操作,因此!true的值為false,更羅嗦的說法是(!true==false)==true,雖然表達方式不一樣,不過我們一般會采用簡潔的布爾表達式,就像用x來表示x==true

布爾值可以和&&(AND)和||(OR)操作符結合,並且有短路行為:如果運算符左邊值已經可以確定整個布爾表達式的值,那么運算符右邊的值將不再被求值,因此下面的表達式總是安全的:

s != "" && s[0] == 'x' 

其中s[0]操作如果應用於空字符串將會導致panic異常。

因為&&的優先級比||高(助記:&&對應邏輯乘法,||對應邏輯加法,乘法比加法優先級要高),下面形式的布爾表達式是不需要加小括弧的:

if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { // ...ASCII letter or digit... } 

布爾值並不會隱式轉換為數字值0或1,反之亦然。必須使用一個顯式的if語句輔助轉換:

i := 0 if b { i = 1 } 

如果需要經常做類似的轉換, 包裝成一個函數會更方便:

// btoi returns 1 if b is true and 0 if false. func btoi(b bool) int { if b { return 1 } return 0 } 

數字到布爾型的逆轉換則非常簡單, 不過為了保持對稱, 我們也可以包裝一個函數:

// itob reports whether i is non-zero. func itob(i int) bool { return i != 0 } 
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
1、數組
2、結構體
3、切片
4、哈希表
(1)鍵值對=key/value,
(2)無序
(3)所有的key都有相同的數據類型,且必須是支持==比較運算符,所有的key都是互不相同的,浮點數類型支持相等運算符比較的,但是將浮點數用做key類型則是一個壞的想法。
(4)所有的value也有着相同的類型,對於V對應的value數據類型則沒有任何的限制,但是key和value之間可以是不同的數據類型。
(5)創建map:
ages := make(map[string]int)
map["wangjialun"] = 45
map["igoodful"] = 99
map["zhangdi"] = 100
delete(ages, "igoodful")
---------------
ages := map[string]int{}
map["wangjialun"] = 45
map["igoodful"] = 99
map["zhangdi"] = 100
delete(ages, "igoodful")
---------------
ages := map[string]int{"wangjialun":45, "igoodful":99, "zhangdi":100}
delete(ages, "igoodful")
(6)遍歷map

要想遍歷map中全部的key/value對的話,可以使用range風格的for循環實現,和之前的slice遍歷語法類似。下面的迭代語句將在每次迭代時設置name和age變量,它們對應下一個鍵/值對:

for name, age := range ages { fmt.Printf("%s\t%d\n", name, age) }
(7)排序遍歷

Map的迭代順序是不確定的,並且不同的哈希函數實現可能導致不同的遍歷順序。在實踐中,遍歷的順序是隨機的,每一次遍歷的順序都不相同。這是故意的,每次都使用隨機的遍歷順序可以強制要求程序不會依賴具體的哈希函數實現。如果要按順序遍歷key/value對,我們必須顯式地對key進行排序,可以使用sort包的Strings函數對字符串slice進行排序。下面是常見的處理方式:

import "sort" var names []string for name := range ages { names = append(names, name) } sort.Strings(names) for _, name := range names { fmt.Printf("%s\t%d\n", name, ages[name]) } 
 
 

內置的make函數可以創建一個map:

ages := make(map[string]int) // mapping from strings to ints 

我們也可以用map字面值的語法創建map,同時還可以指定一些最初的key/value:

ages := map[string]int{ "alice": 31, "charlie": 34, } 

這相當於

ages := make(map[string]int) ages["alice"] = 31 ages["charlie"] = 34 

因此,另一種創建空的map的表達式是map[string]int{}

Map中的元素通過key對應的下標語法訪問:

ages["alice"] = 32 fmt.Println(ages["alice"]) // "32" 

使用內置的delete函數可以刪除元素:

delete(ages, "alice") // remove element ages["alice"] 

所有這些操作是安全的,即使這些元素不在map中也沒有關系;如果一個查找失敗將返回value類型對應的零值,例如,即使map中不存在“bob”下面的代碼也可以正常工作,因為ages["bob"]失敗時將返回0。

ages["bob"] = ages["bob"] + 1 // happy birthday! 

而且x += yx++等簡短賦值語法也可以用在map上,所以上面的代碼可以改寫成

ages["bob"] += 1 

更簡單的寫法

ages["bob"]++ 

但是map中的元素並不是一個變量,因此我們不能對map的元素進行取址操作:

_ = &ages["bob"] // compile error: cannot take address of map element 

禁止對map元素取址的原因是map可能隨着元素數量的增長而重新分配更大的內存空間,從而可能導致之前的地址無效。






 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM