麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Go語言學習(3)-類型

2019-11-10 20:31:17
字體:
來源:轉載
供稿:網友

Go語言內置的基礎類型:

布爾類型:bool; 整型:int8、byte、int16、int、uint、uintptr等; 浮點類型:float32、float64; 復數類型:complex64、complex128; 字符串:string; 字符類型:rune; 錯誤類型:error; 此外,Go語言也支持以下這些復合類型: 指針(pointer) 數組(array) 切片(slice) 字典(map) 通道(chan) 結構體(struct) 接口(interface)

1、布爾類型

var v1 bool v1 = true v2 := (1 == 2) // v2也會被推導為bool類型 布爾類型不能接受其他類型的賦值,不支持自動或者強制的類型轉化。 以下會導致編譯出錯 var b bool b = 1

2、整型

類 型 長度 (字節) 值 范 圍 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

3、浮點型

Go語言定義了兩個類型float32和float64,其中float32等價于C語言的float類型,float64等價于C語言的double類型 fvalue2:=12.0 其類型將被自動設為float64,若是不加小數點,則自動推導為int類型 若是用==來判斷兩個浮點數是否相等,可能會導致不穩定的結果

4、復數類型

復數實際上由兩個實數構成,一個表示實部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

5、字符串

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語言內置函數,用于獲取字符串長度

6、字符類型

在Go語言中支持兩個字符類型,一個是byte(實際上是unit8的別名)代表UTF-8字符串的單個字節的值;另一個是rune,代表單個unicode字符。

7、數組

一些常規的數組聲明方法:

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]

8、切片數組

上述所知數組的特點:數組的長度在定義之后無法再次修改;數組是指類型,每次傳遞都將產生一份副本。顯然這種數據結構是無法滿足開發者的真正需求。 不用失望,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個位置

9、Map

變量聲明: 如: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.") }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久色视频网站 | 欧美日韩国产一区二区三区在线观看 | 91成人影院| 久久手机在线视频 | 羞羞视频免费观看网站 | 国产一国产一级毛片视频 | 久久超 | 久久手机在线视频 | 国产1区在线观看 | 免费a级作爱片免费观看欧洲 | 久久久日韩精品一区二区三区 | 国产欧美在线观看不卡一 | 日本a级一区 | 中文字幕综合在线观看 | 黄色一级片免费在线观看 | 未成年人在线观看 | 成人毛片100部免费观看 | 免费观看视频91 | 一级毛片免费高清视频 | 亚洲精品午夜在线 | 91在线视频免费观看 | 国产在线区 | 片在线观看 | 懂色av懂色aⅴ精彩av | 精品久久久久久久久亚洲 | 免看黄大片aa | 鲁丝一区二区二区四区 | 一本色道久久综合亚洲精品小说 | 欧美成人午夜 | 国产亚洲精品久久久闺蜜 | 免费a视频 | 亚洲精品久久久久www | 1314av| 午夜视频你懂的 | 国产激爽大片在线播放 | 毛片118极品美女写真 | 羞羞视频免费网站男男 | 亚洲福利视频52 | 一区二区久久电影 | 亚洲成人在线视频网站 | 欧美性受xxxx人人本视频 |