布爾類型:bool; 整型:int8、byte、int16、int、uint、uintptr等; 浮點類型:float32、float64; 復數類型:complex64、complex128; 字符串:string; 字符類型:rune; 錯誤類型:error; 此外,Go語言也支持以下這些復合類型: 指針(pointer) 數組(array) 切片(slice) 字典(map) 通道(chan) 結構體(struct) 接口(interface)
var v1 bool v1 = true v2 := (1 == 2) // v2也會被推導為bool類型 布爾類型不能接受其他類型的賦值,不支持自動或者強制的類型轉化。 以下會導致編譯出錯 var b bool b = 1
類 型 長度 (字節) 值 范 圍 int8 1 128 ~ 127 uint8(即byte) 1 0 ~ 255 int16 2 -32768 ~ 32767 uint16 2 0 ~ 65535 int32 4 -2147483648 ~ 2 147483647 uint32 4 0 ~ 4294967295 int64 8 -9223372036854 775808 ~ 9223 372036854 uint64 8 0 ~ 18446744073 709551615 int 平臺相關(32位機器上同int32,64位機器同int64) 平臺相關(32位機器上同int32,64位機器同int64) uint 平臺相關 平臺相關 uintptr 同指針在32位平臺下為4字節,64位平臺下為8字節
常規開發中使用int或者uint即可
需要注意的是: int和int32在Go語言里被認為是兩種不同的類型,編譯器也不會幫你自動做類型轉換,比如以下的例子會編譯錯誤 var value2 int32 value1 := 64 //value1將會被自動推導為int類型 value2 = value1 //編譯錯誤,由于類型不一致 可以自己做強制轉換 value2 = (int32)value1
Go語言定義了兩個類型float32和float64,其中float32等價于C語言的float類型,float64等價于C語言的double類型 fvalue2:=12.0 其類型將被自動設為float64,若是不加小數點,則自動推導為int類型 若是用==來判斷兩個浮點數是否相等,可能會導致不穩定的結果
復數實際上由兩個實數構成,一個表示實部real,一個表示虛部imag 復數的表示 var value1 complex64 value1 = 3.2+12i value2 := 3.2+12i //value2是complex128類型 value3 := complex(3.2,12) 對于一個復數z=complex(x,y),就可以通過Go語言的內置函數real(z)獲取該復數的實部,也就是x,通過imag(z)獲取該復數的虛部,也就是y
Go語言中字符串的聲明和初始化舉例如下
func main(){ var str string str="hello world" ch:=str[0] fmt.//執行結果 The length of “hello world” is 11 The first character of “hello world” is h. 字符串的內容可以用類似于數組下標的方式獲取,但是與數組不同,字符串的內容不能在初始化之后被修改 如上述 str[0]=’x’ 會出現編譯錯誤 len(str) Go語言內置函數,用于獲取字符串長度在Go語言中支持兩個字符類型,一個是byte(實際上是unit8的別名)代表UTF-8字符串的單個字節的值;另一個是rune,代表單個unicode字符。
一些常規的數組聲明方法:
func main(){ var arr [32]byte //定義了一個長度為32的byte類型數組 arr[0]=1 fmt.Print(arr) fmt.Print(len(arr)) var arr2 [2]struct { x, y int32 } //復雜類型數組 fmt.Print(arr2) var arr3 [1000]*float64 //指針類型數組 [3][5]int // 二維數組 --表示三行五列的二維數組 //可以用Go語言的內置函數len()來獲取。下面是一個獲取數組arr元素個數的寫法: arrLength := len(arr)}元素訪問
for i:=0;i<len(arr);i++{ fmt.Print(arr[i]) }j:表示角標,v表示值。若是只需要用到其中一個,另一個可用匿名函數代替
for j,v :=range arr{ fmt.Println("arr element[", j, "]=", v) }值類型 需要特別注意的是,在Go語言中數組是一個值類型,所有的值類型變量在賦值和作為參數傳遞時都將產生一次復制動作。如果將數組作為函數的參數類型,則在函數調用時該參數將發生數據復制。因此,在函數體中無法修改傳入的數組內容,因為函數內操作的只是傳入數組的一個副本; 如下示例:
func main(){ array := [5]int{1,2,3,4,5} // 定義并初始化一個數組 modify(array) // 傳遞給一個函數,并試圖在函數體內修改這個數組內容 fmt.Println("In main(), array values:", array)}func modify(array [5]int) { array[0] = 10 // 試圖修改數組的第一個元素 fmt.Println("In modify(), array values:", array)}執行結果: In modify(), array values: [10 2 3 4 5] In main(), array values: [1 2 3 4 5]
上述所知數組的特點:數組的長度在定義之后無法再次修改;數組是指類型,每次傳遞都將產生一份副本。顯然這種數據結構是無法滿足開發者的真正需求。 不用失望,Go語言提供了數組切片(slice)這個非常酷的功能來彌補數組的不足。 初看起來,數組切片就像是一個指向數組的指針,實際上它擁有自己的數據結構,而不僅僅是一個指針。數組切片的數據結構可以抽象為以下3個變量: 1、一個指向原生數組的指針; 2、數組切片中的元素個數; 3、數組切片已分配的存儲空間;
創建數組切片: 創建數組切片的方法主要有兩種-基于數組和直接創建; 基于數組方法示例:
func main(){ // 先定義一個數組 var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // 基于數組創建一個數組切片 var mySlice []int = myArray[:5]//前五個元素創建切片數組 var mySlice2 []int = myArray[5:]//后五個元素創建切片數組 fmt.Println("Elements of myArray: ") for _, v := range myArray { fmt.Print(v, " ") } fmt.Println("/nElements of mySlice: ") for _, v := range mySlice { fmt.Print(v, " ") } fmt.Println("/nElements of mySlice2: ") for _, v := range mySlice2 { fmt.Print(v, " ") } fmt.Println()}Go語言支持用myArray[first:last]這樣的方式來基于數組生成一個數組切片,下標包含first不包含last,類似subString方法 直接創建示例: Go語言提供的內置函數make()可以用于靈活地創建數組切片。
func main(){ //創建一個初始元素個數為5的數組切片,元素初始值為0: mySlice1 := make([]int, 5) //創建一個初始元素個數為5的數組切片,元素初始值為0,并預留10個元素的存儲空間: mySlice2 := make([]int, 5, 10) //直接創建并初始化包含5個元素的數組切片: mySlice3 := []int{1, 2, 3, 4, 5} for _,v:=range mySlice1{ fmt.Print(v) } for _,v:=range mySlice2{ fmt.Print(v) } for _,v:=range mySlice3{ fmt.Print(v) }}元素遍歷同普通數組 動態增減元素: 數組切片支持Go語言內置的cap()函數和len()函數,其中cap()函數返回的是數組切片分配的空間大小,而len()函數返回的是數組切片中當前所存儲的元素個數。 如果需要往上例中mySlice已包含的5個元素后面繼續新增元素,可以使用append()函數。 如:mySlice = append(mySlice,1,2,3) 函數append()的第二個參數是一個不定參數,我們可以按照我們的需求添加,甚至直接將一個數組切片追加到另一個數組切片的末尾。 如:mySlice = append(mySlice,mySlice2…) 我們在第二個參數mySlice2后面加了三個點,如果省略的話,會有編譯錯誤。因為mySlice中的元素類型是int,所以直接傳遞mySlice2是行不通的。加上省略號相當于把mySlice2包含的所有元素打散后傳入。 基于數組切片后創建數組切片 oldSlice := []int{1, 2, 3, 4, 5} newSlice := oldSlice[:3] // 基于oldSlice的前3個元素構建新數組切片 有意思的是,選擇的oldSlicef元素范圍甚至可以超過所包含的元素個數,比如newSlice可以基于oldSlice的前6個元素創建,雖然oldSlice只包含5個元素。只要這個選擇的范圍不超過oldSlice存儲能力(即cap()返回的值),那么這個創建程序就是合法的。newSlice中超出 oldSlice元素的部分都會填上0。 內容復制 數組切片支持Go語言的另一個內置函數copy(),用于將內容從一個數組切片復制到另一個數組切片。如果將入的兩個數組切片不一樣大,會按照較小的那個數組切片的元素個數進行復制。 slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) // 只會復制slice1的前3個元素到slice2中 copy(slice1, slice2) // 只會復制slice2的3個元素到slice1的前3個位置
變量聲明: 如:var myMap map[string] PersonInfo 聲明一個map,key是string類型,value是PersonInfo類型
創建: 我們可以使用Go語言的內置函數make()來創建一個新map。下面的這個例子創建了一個key類型為string、值類型為PersonInfo的map: myMap = make(map[string] PersonInfo) 也可以創建一個初始存儲能力為100的map: 如:myMap = make(map[string] PersonInfo,100) 創建并初始化: myMap = map[string] PersonInfo{ “1234”: PersonInfo{“1”, “Jack”, “Room 101,…”}, }
元素賦值: myMap[“test”] = PersonInfo{“1”, “Jack”, “Room 101,…”}
元素刪除: delete(myMap, “test”)
元素查找: value, ok := myMap[“test”] if ok { // 找到了 // 處理找到的value } 判斷是否成功找到特定的鍵,不需要檢查渠道的值是否為nil,只需要查看第二個返回值ok。 示例:
package mainimport ("fmt")type PersonInfo struct { ID string Name string Address string}func main(){ var personDB map[string] PersonInfo personDB = make(map[string] PersonInfo) // 往這個map里插入幾條數據 personDB["test"] = PersonInfo{"12345", "Tom", "Room 203,..."} personDB["test1"] = PersonInfo{"1", "Jack", "Room 101,..."} // 從這個map查找鍵為"1234"的信息 person, ok := personDB["test"] // ok是一個返回的bool型,返回true表示找到了對應的數據 if ok { fmt.Println("Found person", person.Name, "with ID test.") } else { fmt.Println("Did not find person with ID test.") }}
|
新聞熱點
疑難解答