这是我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)
}
赞赏微信赞赏
支付宝赞赏