失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 五 Go语言复合数据类型(下)

五 Go语言复合数据类型(下)

时间:2019-07-09 03:26:24

相关推荐

五 Go语言复合数据类型(下)

@Author:Runsen

复合数据类型主要包含Go中的一些复杂类型,主要有指针类型,数组类型,切片类型,结构体类型,Map类型和Channel类型

下面,我们继续学习结构体类型,Map类型和Channel类型。

文章目录

结构体类型Map类型Channel类型

结构体类型

在C语言我们都接触过结构体,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

下面就是结构体定义:

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数据结构,Go语言的Map就是哈希表数据结构。

声明map类型变量

map[keyType]valueType

其中:

keyType:是key的类型valueType:是key对应的值的类型

map类型的初始值是nil,要使用需要使用make()函数来初始化分配内存地址,语法如下:

make(map[keyType]valueType, [cap])

其中cap 表示map的容量。该参数虽然不是必须的,但是我们应该在初始化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一种特殊的数据类型,有点像Linux系统中的管道/消息队列。

这里go是用于goroutines之间的通信,goroutine可以说 是用户的线程,不同的 goroutine 之间是有消息传递这个需求的。

既然 channel 是一个管道,用来满足不同 goroutine 间交换消息的。那么实现这样一个管道要怎么做呢?其实很简单。下面先把示例代码贴出来。

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)}}

输出结果:

12345

首先main函数开启了两个goroutine,一个用于执行send函数,该函数每次向channel ch中发送写入一个int数值。一个执行receive函数,该函数每次从channel ch中读取一个int数值。

如果当channel中没有数据可读时,receive goroutine则会进入阻塞状态。因为receive中使用了for无限循环,表示receive这个goroutine会一直阻塞下去,直到从channel ch中读取到数据,读取到数据后进入下一轮循环由被阻塞在recv = <-ch上。

当main函数中的睡眠时间到了指定的时间后,main程序终止,意味着主程序结束,所有goroutine停止执行。

如果觉得《五 Go语言复合数据类型(下)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。