Go入门:五、goroutine和channel

这是我Go学习的第五篇笔记,学习的是go的语言的其他特性,这些特性是其他语言所不具备的。这次主要学习的是goroutine和channel。

我的语言学习过程一般分为下面几个:

1. 变量和数据类型
2. 流程控制方法
3. 函数声明和调用
4. 面向对象
5. 语言特性
6. 常用标准库

goroutine介绍和使用

Go语言中,每个并发执行的单元称为goroutine(可类比线程)。当一个程序启动时候,main函数在一个main goroutine中运行。如果想要创建新的goroutine,使用go关键字!

语法

创建一个新的 goroutine

go 函数名()

channel是goroutine的通信机制,比如创建一个能够接收int类型的channel,使用make创建:

// 创建一个channel
ch := make(chan int)

// 将i发送到channel
i := 1
ch <- i

// 从channel中接收数据
j := <-ch

// 丢弃channel中的数据
<-ch

同样,可以定义接收任意数据类型的channel

ch := make(chan interface{})

使用

并发通常应用在io操作较密集的地方,比如发起多个网络请求!通常串行发起网络请求是很慢的,大部分时间浪费在等待网络io上了。通过并发去请求能够显著提高整体耗时!

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

// 发起一个http get请求
// 把获取到的内容写入到channel
func httpget(url string, chc chan map[string]string) {
	resp, err := http.Get(url)
	if err != nil {
		// 错误处理
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		// 错误处理
	}
	var i = make(map[string]string)
	i[url] = string(body)
	chc <- i
}

func main() {
	chc := make(chan map[string]string)
	go httpget("http://www.baidu.com/", chc)
	go httpget("http://www.qq.com/", chc)
	// 等待完成
	var content map[string]string
	content = <-chc
	fmt.Println(content)
	content = <-chc
	fmt.Println(content)
}

赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注