bsatoshi-bitcoin-blockchain-basic
Search…
1.0.0
Introduction
Part I
README
导读
什么是比特币
为什么会出现比特币
为什么要持有比特币
比特币真的是货币吗?
比特币的价值是什么
比特币是怎么产生的,它是否真实存在
什么是挖矿?
为什么挖矿可以挖到比特币
除了挖矿还可以怎么得到比特币
比特币这么多年是如何运行并未宕机的
比特币解决了什么痛点
比特币对现在社会的影响是什么
比特币会有持续的价值吗
现实社会的不公平,在比特币的世界存在吗
结束语
区块链基础-前序
区块链基础-什么是区块链
区块链基础-区块链用到了哪些技术
区块链基础-为什么会出现区块链
区块链基础-区块链是怎么产生的,它是否真实存在
区块链基础-区块链的价值是什么
区块链基础-区块链解决了什么痛点
区块链基础-区块链对现在社会的影响是什么
区块链基础-区块链未来可以应用在哪些行业
区块链基础-区块链目前是否有落地项目
区块链基础-区块链技术是否值得学习
区块链基础-公有链,联盟链、私有链、跨链、侧链是什么意思
区块链基础-什么是超级账本
区块链基础-什么是以太坊
区块链基础-什么是智能合约
区块链基础-什么是Defi
区块链基础-共识算法有哪些?Pow、Pos、Dpos、拜占庭都是什么?
区块链基础-什么是零知识证明
区块链基础-什么是闪电网络
区块链基础-什么是DAG技术
炒币基础-为什么要炒币
炒币基础-炒币真的可以财富自由吗?
炒币基础-炒币的流程是什么
炒币基础-币币交易和OTC的区别
炒币基础-炒币常用交易所有哪些
炒币基础-炒币常用钱包推荐
炒币基础-炒币常用工具推荐
炒币基础-炒币有哪些媒体值得看
炒币基础-炒币有哪些行情分析师可以看
炒币基础-怎么查询区块交易
炒币基础-怎么判断一个币是好是坏
炒币基础-怎么样埋伏百倍币?
炒币基础-炒币是投机吗?
炒币基础-一个币的基本面要怎么看,怎么识别这个币是否是cx?
炒币基础-定投炒币靠谱吗
炒币基础-Pos和Defi可以玩吗?
炒币基础-如何当一个合格的矿工?
炒币基础-为什么炒币总是卖出就涨,买入就跌?
炒币基础-庄是什么、韭菜是什么?
炒币基础-币圈有哪些不为人知的黑幕?
炒币基础-币圈和链圈的区别
炒币基础-币圈有哪些国外的渠道值得关注
炒币基础-借钱炒币这事靠谱吗?
Part II
比特币开发系列文章:虚拟机搭建比特币运行环境
加密算法系列之:des加密、aes加密、3des加密、对称加密、非对称加密、Hash 算法
bip协议是什么
raft协议是什么
pbft协议是什么
侧链开发和跨链开发需要了解哪些知识
比特币交易流程
比特币挖矿流程和默克尔树
比特币多重签名
比特币闪电网络
eos区块链环境搭建
2020年Macos最全 ETH区块链环境搭建,并使用Truffle创建第一个Dapps
eth 开发快速开发一个dapp
Part III
Go语言基础入门课程
Golang 快速搭建开发环境
Golang 基础语法
Golang 基础之编码规范
Golang 基础之接口
Golang 基础之错误处理
Golang 基础之json
Golang 基础之如何使用Go Module和Go proxy
Go语言基础常用包
Go语言之channel
Go语言之select用法
细说Go语言之Goroutine
Go语言实现pos协议
Go语言实现dpos协议
Go语言实现raft协议
Go语言实现pbft协议
Go语言系列课程之solidity语法入门
Go语言高级课程
Go语言开发区块链实战
Part IV
React实现区块链入门课程
Vue实现区块链入门课程
cosmos 开发dapp
Powered By
GitBook
Go语言之channel
什么是Channel
通道(channel),就像一个可以用于发送类型化数据的管道,由其负责协程之间的通信,从而避开所有由共享内存导致的陷阱;这种通过通道进行通信的方式保证了同步性。数据在通道中进行传递:在任何给定时间,一个数据被设计为只有一个协程可以对其访问,所以不会发生数据竞争。
channel是带有类型的管道,你可以通过它用信道操作符 <- 来发送或者接收值,“箭头”就是数据流的方向
ch <- v // 将 v 发送至信道 ch。
v := <-ch // 从 ch 接收值并赋予 v。
默认情况下,发送和接收操作在另一端准备好之前都会阻塞
和映射与切片一样,信道在使用前必须创建:ch := make(chan int)
channel可以是 带缓冲的。将缓冲长度作为第二个参数提供给 make 来初始化一个带缓冲的信道:
方式一: var ch1 chan int ch1 = make(chan int)
方式二: ch := make(chan int, 100),通道只能传递100个数据(buf 是通道可以同时容纳的元素个数)
仅当信道的缓冲区填满后,向其发送数据时才会阻塞。当缓冲区为空时,接受方会阻塞。(fatal error: all goroutines are asleep - deadlock!)
例子
1
func sum(s []int, c chan int) {
2
sum := 0
3
for _, v := range s {
4
sum += v
5
}
6
c <- sum // 将和送入 c
7
}
8
9
10
func main() {
11
s := []int{7, 2, 8, -9, 4, 0}
12
13
c := make(chan int)
14
go sum(s[:len(s)/2], c)
15
go sum(s[len(s)/2:], c)
16
x, y := <-c, <-c // 从 c 中接收
17
18
fmt.Println(x, y, x+y)
19
}
Copied!
关闭channel
发送者可通过 close 关闭一个信道来表示没有需要发送的值了。
接收者可以通过为接收表达式分配第二个参数来测试信道是否被关闭:若没有值可以接收且信道已被关闭,那么在执行完之后 ok 会被设置为 false。
v, ok := <-ch
1
func fibonacci(n int, c chan int) {
2
x, y := 0, 1
3
for i := 0; i < n; i++ {
4
c <- x
5
x, y = y, x+y
6
}
7
close(c)
8
}
9
10
11
c := make(chan int, 10)
12
go fibonacci(cap(c), c)
13
for i := range c {
14
fmt.Println(i)
15
}
Copied!
通道的同步
使用通道来同步协程之间的执行
1
// 这个worker函数将以协程的方式运行
2
// 通道`done`被用来通知另外一个协程这个worker函数已经执行完成
3
func worker(done chan bool) {
4
fmt.Print("working...")
5
time.Sleep(time.Second)
6
fmt.Println("done")
7
// 向通道发送一个数据,表示worker函数已经执行完成
8
done <- true
9
}
10
// 使用协程来调用worker函数,同时将通道`done`传递给协程
11
// 以使得协程可以通知别的协程自己已经执行完成
12
done := make(chan bool, 1)
13
go worker(done)
14
// 一直阻塞,直到从worker所在协程获得一个worker执行完成的数据
15
<-done
Copied!
解决阻塞的2种办法
使用select的default语句,在channel不可读写时,即可返回
使用select+定时器,在超时时间内,channel不可读写,则返回(推荐方式)
本教程系列代码
示例代码
推荐阅读
理解 Go 中的 JSON
Part III - Previous
Go语言基础常用包
Next - Part III
Go语言之select用法
Last modified
2yr ago
Copy link
Contents
什么是Channel
例子
关闭channel
通道的同步
解决阻塞的2种办法
本教程系列代码
推荐阅读