golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取、单元测试

本文主要是介绍golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取、单元测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      • goroute初识
      • channel存取
      • 开启goroute实现chan之间的同步存取
      • channel关闭
      • range
        • 单元测试

goroute初识

package mainimport ("fmt"// "os""time"
)func test(){var i int for {fmt.Println(i)time.Sleep(time.Second)i++}
}func main() {go test()for {fmt.Println("running in main")time.Sleep(time.Second)}
}

利用go 启动一个goroute

channel存取

先进先出
线程安全,多个goroutine同时访问,不需要加锁
channel是有类型的,一个整数的channel只能存放整数

package mainimport ("fmt"// "fmt")
type Stu struct{name string
}func main() {//int类型var intChan chan int intChan = make(chan int,10)intChan <- 10a := <- intChanfmt.Println(a)fmt.Println("--------/map类型---------")//map类型var mapChan chan map[string]stringmapChan = make(chan map[string]string,10)m:= make(map[string]string,16)m["stu01"] = "001"m["stu02"] = "002"m["stu03"] = "003"mapChan <- mb := <- mapChanfmt.Println(b)fmt.Println("--------结构体---------")//结构体var stuChan chan StustuChan = make(chan Stu,10)stu:= Stu{name:"safly",}stuChan <- stutempStu := <- stuChanfmt.Println(tempStu)fmt.Println("--------结构体内存地址---------")//结构体内存地址值var stuChanId chan *StustuChanId = make(chan *Stu,10)stuId := &Stu{name:"safly",}stuChanId <- stuIdtempStuId := <- stuChanIdfmt.Println(tempStuId)fmt.Println(*(tempStuId))fmt.Println("-----------接口---------")//接口var StuInterChain chan interface{}StuInterChain = make(chan interface{},10)stuInit:= Stu{name:"safly",}//存StuInterChain <- &stuInit//取mFetchStu:= <- StuInterChainfmt.Println(mFetchStu)//转var mStuConvert *StumStuConvert,ok := mFetchStu.(*Stu)if !ok{fmt.Println("cannot convert")return}fmt.Println(mStuConvert)fmt.Println(*(mStuConvert))}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
10
--------/map类型---------
map[stu03:003 stu01:001 stu02:002]
--------结构体---------
{safly}
--------结构体内存地址---------
&{safly}
{safly}
-----------接口---------
&{safly}
&{safly}
{safly}
PS E:\golang\go_pro\src\safly>

开启goroute,实现chan之间的同步存取

package mainimport ("time""fmt"
)func main() {intChan := make(chan int,5)go write(intChan)go read(intChan)time.Sleep(10 *time.Second)
}/*
由于管道容量是5,开启go写入10个数据,再写入5个数据,
会阻塞,
然而read每秒会读取一个,然后在会写入一个数据*/
func write(ch chan int){for i:= 0;i<10;i++{ch <- ifmt.Println("put data:",i)}
}func read(ch chan int){for{var b intb = <- chfmt.Println(b)time.Sleep(time.Second)}
}

测试输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
put data: 0
put data: 1
put data: 2
put data: 3
put data: 4
put data: 5
0
1
put data: 6
2
put data: 7
3
put data: 8
4
put data: 9
5
6
7
8
9
PS E:\golang\go_pro\src\safly>

channel关闭

channel关闭后,就不能取出数据了

package mainimport "fmt"func main() {var ch chan intch = make(chan int, 5)for i := 0; i < 5; i++ {ch <- i}close(ch)for {var b intb, ok := <-chif ok == false {fmt.Println("chan is close")break}fmt.Println(b)}
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
0
1
2
3
4
chan is close
PS E:\golang\go_pro\src\safly>

如果将close(ch)注释掉,意思是不关闭管道,那么会出现dead lock死锁
因为存入管道5个数字,然后无限取数据,会出现死锁

range

package mainimport "fmt"func main() {var ch chan intch = make(chan int, 10)for i := 0; i < 10; i++ {ch <- i}close(ch)for v := range ch {fmt.Println(v)}
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
0
1
2
3
4
5
6
7
8
9
PS E:\golang\go_pro\src\safly>

同样如果将close(ch)注释掉,意思是不关闭管道,那么会出现dead lock死锁
因为存入管道10个数字,然后无限取数据,在取出来第10个数据,在次range管道,会dead lock

单元测试
  1. 文件名必须以_test.go结尾
  2. 使用go test执行单元测试

这里写图片描述

calc.go

package mainfunc add(a, b int) int {return a + b
}func sub(a, b int) int {return a - b
}

calc_test.go

package mainimport ("testing"
)func TestAdd(t *testing.T) {r := add(2, 4)if r != 6 {t.Fatalf("add(2, 4) error, expect:%d, actual:%d", 6, r)}t.Logf("test add succ")
}

来执行test测试如下:

版权所有 (C) 2016 Microsoft Corporation。保留所有权利。PS E:\golang\go_pro> cd src
PS E:\golang\go_pro\src> cd safly
PS E:\golang\go_pro\src\safly> cd test
PS E:\golang\go_pro\src\safly\test> go test
PASS
ok      safly/test      0.053s

这篇关于golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取、单元测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125217

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触