五、Go语言复合数据类型(下)
@Author:Runsen
復合數(shù)據(jù)類型主要包含Go中的一些復雜類型,主要有指針類型,數(shù)組類型,切片類型,結構體類型,Map類型和Channel類型
下面,我們繼續(xù)學習結構體類型,Map類型和Channel類型。
文章目錄
- 結構體類型
- Map類型
- Channel類型
結構體類型
在C語言我們都接觸過結構體,結構體是由一系列具有相同類型或不同類型的數(shù)據(jù)構成的數(shù)據(jù)集合。
下面就是結構體定義:
type struct_variable_type struct {member definition;member definition;...member definition; }一旦定義了結構體類型,它就能用于變量的聲明,具體的聲明方法如下所示。
variable_name := struct_variable_type {value1, value2...valuen}下面,我們看一個聲明結構體的具體示例。
package mainimport "fmt"type Person struct {Name stringAge int }func main() {// 三種聲明的方法var p1 Personp1.Name = "Runsen"p1.Age = 20fmt.Println(p1)var p2 = Person{Name:"Runsen", Age:20}fmt.Println(p2)p3 := Person{Name:"Runsen", Age:20}fmt.Println(p3) }{Runsen 20} {Runsen 20} {Runsen 20}Map類型
Go和Python一樣,都有map。在Python里叫做字典,在Go里叫做映射。
Map是一種常用的kv數(shù)據(jù)結構,Go語言的Map就是哈希表數(shù)據(jù)結構。
聲明map類型變量
map[keyType]valueType其中:
- keyType:是key的類型
- valueType:是key對應的值的類型
map類型的初始值是nil,要使用需要使用make()函數(shù)來初始化分配內存地址,語法如下:
make(map[keyType]valueType, [cap])其中cap 表示map的容量。該參數(shù)雖然不是必須的,但是我們應該在初始化map的時候就為其指定一個合適的容量。
下面嘗試著在結構體類型中使用Map,具體代碼如下。
package mainimport ("fmt" )type Student struct {name stringage int }func useMap() {//使用前應該先初始化, 否則panic報錯// var map1 map[string]string// map1["a"] = "b" // will panicmap1 := make(map[string]Student)map1["s1"] = Student{name:"Runsen", age:20}fmt.Printf("%v\n", map1) //map[s1:{Runsen 20}]}func main() {useMap() }Channel類型
go的channel,channel翻譯為頻道,顧名思義用來通信的,它是go一種特殊的數(shù)據(jù)類型,有點像Linux系統(tǒng)中的管道/消息隊列。
這里go是用于goroutines之間的通信,goroutine可以說 是用戶的線程,不同的 goroutine 之間是有消息傳遞這個需求的。
既然 channel 是一個管道,用來滿足不同 goroutine 間交換消息的。那么實現(xiàn)這樣一個管道要怎么做呢?其實很簡單。下面先把示例代碼貼出來。
package mainimport ("fmt""time" )func main() {ch := make(chan int) // 無緩沖go send(ch)go receive(ch)time.Sleep(time.Second * 1) }func send(ch chan int){ch <- 1ch <- 2ch <- 3ch <- 4ch <- 5 }func receive(ch chan int){var recv intfor{recv = <- chfmt.Println(recv)} }輸出結果:
1 2 3 4 5首先main函數(shù)開啟了兩個goroutine,一個用于執(zhí)行send函數(shù),該函數(shù)每次向channel ch中發(fā)送寫入一個int數(shù)值。一個執(zhí)行receive函數(shù),該函數(shù)每次從channel ch中讀取一個int數(shù)值。
如果當channel中沒有數(shù)據(jù)可讀時,receive goroutine則會進入阻塞狀態(tài)。因為receive中使用了for無限循環(huán),表示receive這個goroutine會一直阻塞下去,直到從channel ch中讀取到數(shù)據(jù),讀取到數(shù)據(jù)后進入下一輪循環(huán)由被阻塞在recv = <-ch上。
當main函數(shù)中的睡眠時間到了指定的時間后,main程序終止,意味著主程序結束,所有goroutine停止執(zhí)行。
總結
以上是生活随笔為你收集整理的五、Go语言复合数据类型(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 按揭与抵押贷款的区别
- 下一篇: 四、Go语言复合数据类型(上)