这是我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)
}
你可能还喜欢下面这些文章
这是我的Go学习的第六篇笔记,也是Go入门的最后一篇笔记。在大多数语言中,了解了变量和数据类型,流程控制,函数,面向对象,再加上标准库,就可以用这门语言去写一些项目了。首先让我想想,在工作中通常会用语言频繁处理什么问题或者处理什么数据?最常见的应该是各种字符串操作,日期和时间,读写文件、socket等IO相关的操作!字符串处理 — StringsString提供了一组处理字符串的操作,常用的有:判断一个字符串是否在另一个字符串中分割字符串为[]string和组合[]string为一个字符串字符串替换…太多了,就不一一列举了,这里列出一些常用的字符串操作。字符串判断// 判断子串substr
这是我学习C++的第三篇笔记,函数。我的学习路径是1. 变量和数据类型2. 流程控制3. 函数4. 面向对象5. 标准库现在学习的是函数的声明、定义、调用等相关知识。函数声明和定义函数的声明包含返回类型,函数名字,0个或者多个形参,无函数体,通常在头文件中对函数进行声明。返回类型 函数名称(参数类型1 参数1, 参数类型2 参数2);// 例如声明一个求阶乘的函数int fact(int val);函数的定义包含返回类型,函数名字,0个或多个形参,以及函数体。返回类型 函数名称(参数类型1 参数1, 参数类型2 参数2) { 函数体}比如写一个求阶乘的函数,可以写成下面这样int fac
这是我的Go学习笔记的第四篇,面向对象!现代语言几乎都会面向对象进行了支持!当然,Go也具备面向对象的特性!我的语言学习过程一般分为下面几个:1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 标准库Go语言中的面向对象有点特殊。在Go语言里面,没有显式的class、extends等面向对象语言经常使用的关键词,但是却有面向对象的特性。看看Go怎么实现的把!创建一个类按照我的理解,类实际上就是某种模板,这个模板里面含有有限多个属性和方法。在Go里面,定义这个模板的语法使用type来实现!比如单个int类型可以构成一个类(没错,你甚至可以在int数据类型上
这是我Go学习笔记的第三篇!接下来学习的是Go的函数声明和调用。我的语言学习过程一般分为下面几个:1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 标准库函数声明func 函数名称(参数表) 返回值类型 { // 函数体}写一个函数是非常简单的,掌握语法格式就可以了。函数是一个功能的封装,能让函数体内的代码得到很好的复用。比如我要输出个人信息,我可以把个人信息封装到函数里面,后续直接调用这个函数而不是每次都print一堆信息了package mainimport “fmt”// 定义一个能够打印个人信息的函数func info() { fmt.Pr
这是我的C++学习笔记第二篇,学习流程控制语句我的学习路径如下:1. 变量和数据类型2. 流程控制3. 函数声明和调用4. 面向对象5. 标准库顺序顺序语句为一条一条顺序执行的语句。C++的顺序语句有赋值,四则运算,位运算,逻辑运算等int i = 0;int j = i + 1;条件C++提供两种条件,一个是if条件语句,另一个是switch选择语句。if条件// 单个条件if (条件) { 语句 //条件成立则执行语句}// 带有else的条件if (条件) { 语句} else { 语句}// 带有else if 的条件if (条件1) { 语句1} else if
赞赏微信赞赏
支付宝赞赏