国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Go語言學(xué)習(xí)(3)-類型

2019-11-10 21:30:29
字體:
供稿:網(wǎng)友

Go語言內(nèi)置的基礎(chǔ)類型:

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

1、布爾類型

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

2、整型

類 型 長度 (字節(jié)) 值 范 圍 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 平臺相關(guān)(32位機(jī)器上同int32,64位機(jī)器同int64) 平臺相關(guān)(32位機(jī)器上同int32,64位機(jī)器同int64) uint 平臺相關(guān) 平臺相關(guān) uintptr 同指針在32位平臺下為4字節(jié),64位平臺下為8字節(jié)

常規(guī)開發(fā)中使用int或者uint即可

需要注意的是: int和int32在Go語言里被認(rèn)為是兩種不同的類型,編譯器也不會幫你自動做類型轉(zhuǎn)換,比如以下的例子會編譯錯誤 var value2 int32 value1 := 64 //value1將會被自動推導(dǎo)為int類型 value2 = value1 //編譯錯誤,由于類型不一致 可以自己做強(qiáng)制轉(zhuǎn)換 value2 = (int32)value1

3、浮點(diǎn)型

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

4、復(fù)數(shù)類型

復(fù)數(shù)實(shí)際上由兩個實(shí)數(shù)構(gòu)成,一個表示實(shí)部real,一個表示虛部imag 復(fù)數(shù)的表示 var value1 complex64 value1 = 3.2+12i value2 := 3.2+12i //value2是complex128類型 value3 := complex(3.2,12) 對于一個復(fù)數(shù)z=complex(x,y),就可以通過Go語言的內(nèi)置函數(shù)real(z)獲取該復(fù)數(shù)的實(shí)部,也就是x,通過imag(z)獲取該復(fù)數(shù)的虛部,也就是y

5、字符串

Go語言中字符串的聲明和初始化舉例如下

func main(){ var str string str="hello world" ch:=str[0] fmt.//執(zhí)行結(jié)果 The length of “hello world” is 11 The first character of “hello world” is h. 字符串的內(nèi)容可以用類似于數(shù)組下標(biāo)的方式獲取,但是與數(shù)組不同,字符串的內(nèi)容不能在初始化之后被修改 如上述 str[0]=’x’ 會出現(xiàn)編譯錯誤 len(str) Go語言內(nèi)置函數(shù),用于獲取字符串長度

6、字符類型

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

7、數(shù)組

一些常規(guī)的數(shù)組聲明方法:

func main(){ var arr [32]byte //定義了一個長度為32的byte類型數(shù)組 arr[0]=1 fmt.Print(arr) fmt.Print(len(arr)) var arr2 [2]struct { x, y int32 } //復(fù)雜類型數(shù)組 fmt.Print(arr2) var arr3 [1000]*float64 //指針類型數(shù)組 [3][5]int // 二維數(shù)組 --表示三行五列的二維數(shù)組 //可以用Go語言的內(nèi)置函數(shù)len()來獲取。下面是一個獲取數(shù)組arr元素個數(shù)的寫法: arrLength := len(arr)}

元素訪問

for i:=0;i<len(arr);i++{ fmt.Print(arr[i]) }

j:表示角標(biāo),v表示值。若是只需要用到其中一個,另一個可用匿名函數(shù)代替

for j,v :=range arr{ fmt.Println("arr element[", j, "]=", v) }

值類型 需要特別注意的是,在Go語言中數(shù)組是一個值類型,所有的值類型變量在賦值和作為參數(shù)傳遞時都將產(chǎn)生一次復(fù)制動作。如果將數(shù)組作為函數(shù)的參數(shù)類型,則在函數(shù)調(diào)用時該參數(shù)將發(fā)生數(shù)據(jù)復(fù)制。因此,在函數(shù)體中無法修改傳入的數(shù)組內(nèi)容,因?yàn)楹瘮?shù)內(nèi)操作的只是傳入數(shù)組的一個副本; 如下示例:

func main(){ array := [5]int{1,2,3,4,5} // 定義并初始化一個數(shù)組 modify(array) // 傳遞給一個函數(shù),并試圖在函數(shù)體內(nèi)修改這個數(shù)組內(nèi)容 fmt.Println("In main(), array values:", array)}func modify(array [5]int) { array[0] = 10 // 試圖修改數(shù)組的第一個元素 fmt.Println("In modify(), array values:", array)}

執(zhí)行結(jié)果: In modify(), array values: [10 2 3 4 5] In main(), array values: [1 2 3 4 5]

8、切片數(shù)組

上述所知數(shù)組的特點(diǎn):數(shù)組的長度在定義之后無法再次修改;數(shù)組是指類型,每次傳遞都將產(chǎn)生一份副本。顯然這種數(shù)據(jù)結(jié)構(gòu)是無法滿足開發(fā)者的真正需求。 不用失望,Go語言提供了數(shù)組切片(slice)這個非常酷的功能來彌補(bǔ)數(shù)組的不足。 初看起來,數(shù)組切片就像是一個指向數(shù)組的指針,實(shí)際上它擁有自己的數(shù)據(jù)結(jié)構(gòu),而不僅僅是一個指針。數(shù)組切片的數(shù)據(jù)結(jié)構(gòu)可以抽象為以下3個變量: 1、一個指向原生數(shù)組的指針; 2、數(shù)組切片中的元素個數(shù); 3、數(shù)組切片已分配的存儲空間;

創(chuàng)建數(shù)組切片: 創(chuàng)建數(shù)組切片的方法主要有兩種-基于數(shù)組和直接創(chuàng)建; 基于數(shù)組方法示例:

func main(){ // 先定義一個數(shù)組 var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // 基于數(shù)組創(chuàng)建一個數(shù)組切片 var mySlice []int = myArray[:5]//前五個元素創(chuàng)建切片數(shù)組 var mySlice2 []int = myArray[5:]//后五個元素創(chuàng)建切片數(shù)組 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]這樣的方式來基于數(shù)組生成一個數(shù)組切片,下標(biāo)包含first不包含last,類似subString方法 直接創(chuàng)建示例: Go語言提供的內(nèi)置函數(shù)make()可以用于靈活地創(chuàng)建數(shù)組切片。

func main(){ //創(chuàng)建一個初始元素個數(shù)為5的數(shù)組切片,元素初始值為0: mySlice1 := make([]int, 5) //創(chuàng)建一個初始元素個數(shù)為5的數(shù)組切片,元素初始值為0,并預(yù)留10個元素的存儲空間: mySlice2 := make([]int, 5, 10) //直接創(chuàng)建并初始化包含5個元素的數(shù)組切片: 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) }}

元素遍歷同普通數(shù)組 動態(tài)增減元素: 數(shù)組切片支持Go語言內(nèi)置的cap()函數(shù)和len()函數(shù),其中cap()函數(shù)返回的是數(shù)組切片分配的空間大小,而len()函數(shù)返回的是數(shù)組切片中當(dāng)前所存儲的元素個數(shù)。 如果需要往上例中mySlice已包含的5個元素后面繼續(xù)新增元素,可以使用append()函數(shù)。 如:mySlice = append(mySlice,1,2,3) 函數(shù)append()的第二個參數(shù)是一個不定參數(shù),我們可以按照我們的需求添加,甚至直接將一個數(shù)組切片追加到另一個數(shù)組切片的末尾。 如:mySlice = append(mySlice,mySlice2…) 我們在第二個參數(shù)mySlice2后面加了三個點(diǎn),如果省略的話,會有編譯錯誤。因?yàn)閙ySlice中的元素類型是int,所以直接傳遞mySlice2是行不通的。加上省略號相當(dāng)于把mySlice2包含的所有元素打散后傳入。 基于數(shù)組切片后創(chuàng)建數(shù)組切片 oldSlice := []int{1, 2, 3, 4, 5} newSlice := oldSlice[:3] // 基于oldSlice的前3個元素構(gòu)建新數(shù)組切片 有意思的是,選擇的oldSlicef元素范圍甚至可以超過所包含的元素個數(shù),比如newSlice可以基于oldSlice的前6個元素創(chuàng)建,雖然oldSlice只包含5個元素。只要這個選擇的范圍不超過oldSlice存儲能力(即cap()返回的值),那么這個創(chuàng)建程序就是合法的。newSlice中超出 oldSlice元素的部分都會填上0。 內(nèi)容復(fù)制 數(shù)組切片支持Go語言的另一個內(nèi)置函數(shù)copy(),用于將內(nèi)容從一個數(shù)組切片復(fù)制到另一個數(shù)組切片。如果將入的兩個數(shù)組切片不一樣大,會按照較小的那個數(shù)組切片的元素個數(shù)進(jìn)行復(fù)制。 slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) // 只會復(fù)制slice1的前3個元素到slice2中 copy(slice1, slice2) // 只會復(fù)制slice2的3個元素到slice1的前3個位置

9、Map

變量聲明: 如:var myMap map[string] PersonInfo 聲明一個map,key是string類型,value是PersonInfo類型

創(chuàng)建: 我們可以使用Go語言的內(nèi)置函數(shù)make()來創(chuàng)建一個新map。下面的這個例子創(chuàng)建了一個key類型為string、值類型為PersonInfo的map: myMap = make(map[string] PersonInfo) 也可以創(chuàng)建一個初始存儲能力為100的map: 如:myMap = make(map[string] PersonInfo,100) 創(chuàng)建并初始化: 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里插入幾條數(shù)據(jù) personDB["test"] = PersonInfo{"12345", "Tom", "Room 203,..."} personDB["test1"] = PersonInfo{"1", "Jack", "Room 101,..."} // 從這個map查找鍵為"1234"的信息 person, ok := personDB["test"] // ok是一個返回的bool型,返回true表示找到了對應(yīng)的數(shù)據(jù) if ok { fmt.Println("Found person", person.Name, "with ID test.") } else { fmt.Println("Did not find person with ID test.") }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青铜峡市| 洞口县| 仪陇县| 台南市| 五峰| 科技| 楚雄市| 娄烦县| 雷波县| 深水埗区| 东辽县| 通许县| 哈尔滨市| 海淀区| 达州市| 郁南县| 邓州市| 双峰县| 阿拉善右旗| 仙桃市| 嵊泗县| 贵定县| 汕头市| 南乐县| 鹤壁市| 太和县| 大邑县| 勐海县| 五大连池市| 射阳县| 从江县| 乐都县| 汕头市| 平乐县| 公安县| 华安县| 云南省| 剑河县| 盐池县| 行唐县| 青龙|