以下主要是在读《Go语言程序设计》时记录的一些笔记,关于Go语言的通信和并发相关的内容。
=Start=
goroutine是程序中与其他goroutine完全相互独立而并发执行的函数或者方法调用。
每一个程序至少包含一个goroutine,即会执行main包中的main()函数的主goroutine。
所有的goroutine共享相同的地址空间,同时Go语言提供了锁原语来保证数据能够安全的跨goroutine共享。然而,Go语言推荐的并发方式是通信(通道channel),而非共享数据。
goroutine的创建语句:
go function(arguments) go func(parameters) { block } (arguments)
用于发送和接收数据的语法:
- channel <- value //阻塞发送
- <-channel //接收并将其丢弃
- x := <-channel //接收并将其保存
- x, ok := <-channel //功能同上,同时检查通道是否已关闭或者是否为空
通道的创建语法:
- make(chan Type) //没有声明缓冲区容量的通道就是同步的
- make(chan Type, capacity) //异步通道
Go语言的select语句语法如下:
select { case sendOrReceive1: block1 ... case sendOrReceiveN: blockN default: blockDefault }
如果没有default语句,那么select语句可能会被阻塞。
====
使用通道的两个经验:
1.我们只有在后面检查通道是否关闭(例如在一个for…range循环里,或者select,或者使用<-操作符来检查是否可以接收等)的时候才需要显式地关闭通道;
2.应该由发送端的goroutine关闭通道,而不是由接收端的goroutine来完成。
如果通道并不需要检查是否被关闭,那么不关闭这些通道并没有什么问题,因为通道非常轻量,因此它们不会像打开文件不关闭那样耗尽系统资源。
=EOF=
《 “Go语言中的通信和并发” 》 有 9 条评论
大话程序猿眼里的高并发架构
https://blog.thankbabe.com/2016/09/14/high-concurrency-scheme/
大话程序猿眼里的高并发之续篇
https://blog.thankbabe.com/2017/02/27/high-concurrency-scheme-xp/
Golang版ssh口令破解工具
http://studygolang.com/articles/2811
https://github.com/netxfly/crack_ssh/blob/master/scan_ssh.go
http://blog.csdn.net/winkar/article/details/39376837
https://baokun.li/archives/ssh-scanner/
Go语言程序设计(Programming in Go — by Mark Summerfield)
http://www.qtrac.eu/gobook.html
http://www.qtrac.eu/gobook-1.0.tar.gz
如何理解 Golang 中“不要通过共享内存来通信,而应该通过通信来共享内存”?
https://www.zhihu.com/question/58004055
怎样学习才能拥有所谓“高并发”的经验?
https://www.zhihu.com/question/21177474
并发/高并发
https://www.zhihu.com/topic/19596218/top-answers
https://www.zhihu.com/topic/19757794/top-answers
高并发性能调试经验分享
https://zhuanlan.zhihu.com/p/21348220
gobuster – Go 语言编写的收集网站 URI 和 DNS 子域名的工具
https://github.com/OJ/gobuster
amass – Go 语言编写的子域名收集工具
https://github.com/caffix/amass
Go-deliver – Go 语言编写的 Payload 分发工具
https://github.com/0x09AL/go-deliver
subfinder – 子域名枚举工具(Golang)
https://github.com/Ice3man543/subfinder
A Powerful Subdomain Takeover Tool
https://github.com/Ice3man543/SubOver
Go的Channel很强大,理解其内在概念会让它更强大
https://mp.weixin.qq.com/s/QYY4Z6umM5wn7U5Idwb8PA
你了解goroutine和channel吗?
https://mp.weixin.qq.com/s/BPfUEV81hJUufv0U3Vg79A