Go语言中文网 为您找到相关结果 60

巧妙使用channel实现限流器

普通Limiter 特点:无时间限制,只要不超过数量就可通过 // 基于channel阻塞实现 // 缺点:阻塞无时间限制 type ( ChannelLimiter struct { bufferChannel chan golang.PlaceholderType } ) func NewChannelLimiter(limit int) *ChannelLimiter { return &ChannelLimiter{bufferChannel: make(chan golang.PlaceholderType, limit)} } func (l *ChannelLimiter) Allow() bool { select { case l.bufferChannel <- gola...阅读全文

博文 2020-05-10 23:32:42 Keson

Golang 中状态和结果总结

操作 通道状态 结果 Read nil 阻塞 打开且非空 读取到值 打开且空 阻塞 已关闭(Closed) <初始空值> 只能写入 编译错误 Write nil 阻塞 打开且满 阻塞 打开且非满 写入成功 已关闭(Closed) panic 只能接收 编译错误 close nil panic 打开且非空 关闭 channel,读取成功,直到通道耗尽,然后读取到默认空值 打开但空 关闭 channel, 读取到默认空值 已关闭(Closed) panic 只能接收 编译错误 close nil panic 打开且非空 关闭 channel,读取成功,直到通道耗尽,然后读取到默认空...阅读全文

博文 2020-05-02 21:32:40 北冢

读阿里人如何写周报一文后,想说点啥

#### 阿里人如何写周报原文连接 ``` https://yq.aliyun.com/articles/747144 ``` 我大概说一下文章重点,大家有时间了也可以阅读,重点来了,如下: ##### 写周报的好处 对管理者来说 1. 周报是最高效的沟通载体(因为管理者管理的人多了,所以....) 2. 有效提升团队信息透明度(大家都知道对方在做啥) 3. 文字是可沉淀的团队无形资产(后续能够回顾,总结) 对员工来说 1. 周报是一次很好的沟通机会(和领导交互,写的好了,领导会回复你) 2. 一次自我回顾总结(把这周的知识再从头思考一下) 3. 重新对齐目标(看看这周做的事是不是和自己之前的目标一直,有没有偏离) ##### 写周报的态度 大概是先说了几乎大多数人都讨厌写周报, 有些领导要...阅读全文

博文 2020-03-20 14:02:59 SunPengWei

Go语言:select 语句块

Golang 的select语句块使 goroutine 等待多个通信操作。 select会进行阻塞,直到其中一种情况可以运行,然后再执行该情况。如果好多个情况都可以执行,它将​​随机选择一个。 如果没有其他情况可用,则会运行选择中的default默认情况。 select { case i := <-c: // use i default: // receiving from c would block } default情况下在 channels 中尝试发送或接收而不会阻塞。 例子: package main import "fmt" func fibonacci(c, quit chan int) { x, y := 0, 1 for { select { case c <- x: x,...阅读全文

博文 2020-03-22 17:32:43 落落大方的发卡

golang 基础(26)select

golang_real.jpg select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。 func main(){ c1 := make(chan string) c2 := make(chan string) go func(){ time.Sleep(1 * time.Second) c1 <- "one" }() go func(){ time.Sleep( 2 * time.Second) c2 <- "two" }() for i:= 0; i < 2; i++ { select { case msg1 := <- c...阅读全文

golang sync WaitGroup

刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。 先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。 Add:添加或者减少等待goroutine的数量 Done:相当于Add(-1) Wait:执行阻塞,直到所有的WaitGroup数量变成0 package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i = i ...阅读全文

博文 2019-01-09 14:34:47 lu566

[Go - Note] Channel 阻塞deadlock和panic情况,以及close channel

阻塞: 发生一直阻塞时,会报如下deadlock错误: fatal error: all goroutines are asleep - deadlock! 无缓存channel: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协程读取。 有缓存channel: 通道的缓存无数据,但执行读通道。 通道的缓存已经占满,向通道写数据,但无协程读。 Panic: 1.向已经关闭的channel写。2.关闭已经关闭的channel。 close channel: You needn't close every channel when you've finished with it.It's only necessary to close a channel when it is i...阅读全文

博文 2020-02-20 20:32:39 Arboat