golang基礎數據結構

1.整型

Go語言同時提供了有符號和無符號類型的整數運算。這裏有int8int16int32int64四種大相徑庭大小的有符號整數類型,分別對應八、1六、3二、64bit大小的有符號整數,與此對應的是uint8uint16uint32uint64四種無符號整數類型。git

Unicode字符rune類型是和int32等價的類型,一般用於表示一個Unicode碼點。這兩個名稱能夠互換使用。一樣byte也是uint8類型的等價類型,byte類型通常用於強調數值是一個原始的數據而不是一個小的整數。函數

下面是Go語言中關於算術運算、邏輯運算和比較運算的二元運算符,它們按照優先級遞減的順序排列:ui

*      /      %      <<       >>     &       &^
+      -      |      ^
==     !=     <      <=       >      >=
&&
||

兩個相同的整數類型可使用下面的二元比較運算符進行比較;比較表達式的結果是布爾類型。編碼

==    // 等於
!=    // 不等於
<     // 小於
<=    // 小於等於
>     // 大於
>=    // 大於等於

2.浮點型

Go語言提供了兩種精度的浮點數,float32float64。它們的算術規範由IEEE754浮點數國際標準定義,該浮點數規範被全部現代的CPU支持。操作系統

float32類型的浮點數能夠提供大約6個十進制數的精度,而float64則能夠提供約15個十進制數的精度;一般應該優先使用float64類型,由於float32類型的累計計算偏差很容易擴散,設計

var f float32 = 212213
fmt.Println(f == f + 1)

3.複數

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

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.布爾型

一個布爾類型的值只有兩種:truefalse。if和for語句的條件部分都是布爾類型的值,而且==和<等比較操做也會產生布爾型的值, 布爾值能夠和&&(AND)和||(OR)操做符結合orm

!true // flase
a := 10 
a > 1  // true

5. 字符串

一個字符串是一個不可改變的字節序列。字符串能夠包含任意的數據,包括byte值0,可是一般是用來包含人類可讀的文本。文本字符串一般被解釋爲採用UTF8編碼的Unicode碼點(rune)序列對象

s := "hello, world"
fmt.Println(len(s))     // "12" len() 長度
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')

字符串值也能夠用字符串面值方式編寫,只要將一系列字節序列包含在雙引號便可:blog

"Hello, 世界"

img

由於Go語言源文件老是用UTF8編碼,而且Go語言的文本字符串也以UTF8編碼的方式處理,所以咱們能夠將Unicode碼點也寫到字符串面值中。

在一個雙引號包含的字符串面值中,能夠用以反斜槓\開頭的轉義序列插入任意的數據。下面的換行、回車和製表符等是常見的ASCII控制代碼的轉義方式:

\a      響鈴
\b      退格
\f      換頁
\n      換行
\r      回車
\t      製表符
\v      垂直製表符
\'      單引號 (只用在 '\'' 形式的rune符號面值中)
\"      雙引號 (只用在 "..." 形式的字符串面值中)
\\      反斜槓

5.1.Unicode

由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte)。一個字節能表示的最大的整數就是255(2^8-1=255),而ASCII編碼,佔用0 - 127用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。

若是要表示中文,顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312編碼,用來把中文編進去。

相似的,日文和韓文等其餘語言也有這個問題。爲了統一全部文字的編碼,Unicode應運而生。Unicode把全部語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。

Unicode一般用兩個字節表示一個字符,原有的英文編碼從單字節變成雙字節,只須要把高字節所有填爲0就能夠。

5.2.UTF-8

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是針對Unicode的一種可變長度字符編碼。它能夠用來表示Unicode標準中的任何字符,並且其編碼中的第一個字節仍與ASCII相容,使得原來處理ASCII字符的軟件無須或只進行少部份修改後,即可繼續使用。所以,它逐漸成爲電子郵件、網頁及其餘存儲或傳送文字的應用中,優先採用的編碼。

5.3. 字符串和Byte切片

標準庫中有四個包對字符串處理尤其重要:bytesstringsstrconvunicode包。

  • strings包提供了許多如字符串的查詢、替換、比較、截斷、拆分和合並等功能。
  • bytes包也提供了不少相似功能的函數,可是針對和字符串有着相同結構的[]byte類型。由於字符串是隻讀的,所以逐步構建字符串會致使不少分配和複製。在這種狀況下,使用bytes.Buffer類型將會更有效,稍後咱們將展現。
  • strconv包提供了布爾型、整型數、浮點數和對應字符串的相互轉換,還提供了雙引號轉義相關的轉換。
  • unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等相似功能,它們用於給字符分類。每一個函數有一個單一的rune類型的參數,而後返回一個布爾值。而像ToUpper和ToLower之類的轉換函數將用於rune字符的大小寫轉換。全部的這些函數都是遵循Unicode標準定義的字母、數字等分類規範。strings包也有相似的函數,它們是ToUpper和ToLower,將原始字符串的每一個字符都作相應的轉換,而後返回新的字符串。
  • path和path/filepath包提供了關於文件路徑名更通常的函數操做。使用斜槓分隔路徑能夠在任何操做系統上工做。斜槓自己不該該用於文件名,可是在其餘一些領域可能會用於文件名,例如URL路徑組件。相比之下,path/filepath包則使用操做系統自己的路徑規則,例如POSIX系統使用/foo/bar,而Microsoft Windows使用c:\foo\bar等。
  • 當向bytes.Buffer添加任意字符的UTF8編碼時,最好使用bytes.Buffer的WriteRune方法,可是WriteByte方法對於寫入相似'['和']'等ASCII字符則會更加有效。
  • bytes.Buffer類型有着不少實用的功能,咱們在第七章討論接口時將會涉及到,咱們將看看如何將它用做一個I/O的輸入和輸出對象,例如當作Fprintf的io.Writer輸出對象,或者看成io.Reader類型的輸入源對象。

5.4. 字符串和數字的轉換

除了字符串、字符、字節之間的轉換,字符串和數值之間的轉換也比較常見。由strconv包提供這類轉換功能。

將一個整數轉爲字符串,一種方法是用fmt.Sprintf返回一個格式化的字符串;另外一個方法是用strconv.Itoa(「整數到ASCII」):

x := 123
y := fmt.Sprintf("%d", x)
fmt.Println(y, strconv.Itoa(x)) // "123 123"

FormatInt和FormatUint函數能夠用不一樣的進制來格式化數字:

fmt.Println(strconv.FormatInt(int64(x), 2)) // "1111011"

fmt.Printf函數的%b、%d、%o和%x等參數提供功能每每比strconv包的Format函數方便不少,特別是在須要包含附加額外信息的時候:

s := fmt.Sprintf("x=%b", x) // "x=1111011"

若是要將一個字符串解析爲整數,可使用strconv包的Atoi或ParseInt函數,還有用於解析無符號整數的ParseUint函數:

x, err := strconv.Atoi("123")             // x is an int
y, err := strconv.ParseInt("123", 10, 64) // base 10, up to 64 bits

ParseInt函數的第三個參數是用於指定整型數的大小;例如16表示int16,0則表示int。在任何狀況下,返回的結果y老是int64類型,你能夠經過強制類型轉換將它轉爲更小的整數類型。

6. 常量

常量表達式的值在編譯期計算,而不是在運行期。每種常量的潛在類型都是基礎類型:boolean、string、浮點型或整型。常量不可改變,一個常量的聲明也能夠包含一個類型和一個值,可是若是沒有顯式指明類型,那麼將從右邊的表達式推斷類型。

const 聲明:

const  a = 10				// 整型
const  p = 3.1415926 		// 浮點型
const  str = "zhaohaiyu"	// 字符串
const  flag = true			// 布爾型

若是是批量聲明的常量,除了第一個外其它的常量右邊的初始化表達式均可以省略,若是省略初始化表達式則表示使用前面常量的初始化表達式寫法,對應的常量類型也同樣的。

const (
    a = 1
    b
    c = 2
    d
)

fmt.Println(a, b, c, d) // "1 1 2 2"

6.1.iota 常量生成器

常量聲明可使用iota常量生成器初始化,它用於生成一組以類似規則初始化的常量,可是不用每行都寫一遍初始化表達式。在一個const聲明語句中,在第一個聲明的常量所在的行,iota將會被置爲0,而後在每個有常量聲明的行加一。

const (
	a = 1 + iota
    b
    c
    d
)
fmt.Println(a,b,c,d) // 1,2,3,4
相關文章
相關標籤/搜索