在golang中是否有与”sliding-buffer chan”等效的功能?

huangapple go评论79阅读模式
英文:

Is there any equivalent sliding-buffer chan in golang?

问题

在Go语言中,没有直接等效于Clojure中的sliding-buffer chan的功能。然而,你可以使用带有缓冲区的通道来实现类似的效果。下面是一个示例代码:

package main

import "fmt"

func main() {
    slidingChan := make(chan int, 1)

    go func() {
        for {
            fmt.Println("Received:", <-slidingChan)
        }
    }()

    for n := 0; n < 100; n++ {
        slidingChan <- n
    }
}

这段代码创建了一个带有缓冲区大小为1的通道slidingChan。在一个单独的goroutine中,我们使用无限循环来接收通道中的值,并打印出来。在主goroutine中,我们通过将数字n发送到slidingChan来模拟Clojure中的行为。

请注意,这只是一种近似的实现方式,并不完全等同于Clojure中的sliding-buffer chan。在Go语言中,通道的缓冲区大小是固定的,而不是动态调整的。

英文:

In clojure we can have sliding-buffer chan; Is there any equivalent in golang?

<!-- language: lang-clj -->

(require &#39;[clojure.core.async :refer [go-loop &lt;! &gt;!! sliding-buffer chan]])
(def sliding-chan (chan (sliding-buffer 1)))
(go-loop []
  (println &quot;Received:&quot; (&lt;! sliding-chan))
  (recur))
(dotimes [n 100]
  (&gt;!! sliding-chan n))

;;=&gt; Received: 0 
;;=&gt; Received: 99

答案1

得分: 3

我不这么认为。Go语言有缓冲通道,但当通道已满时它们会阻塞。

你可能需要自己编写一些代码,也许可以使用一个中间的goroutine来管理缓冲区(也许可以使用deque);

英文:

I don't think so. Go has buffered channels but they will block when the channel is full.

You'll probably have to write something yourself, maybe with a goroutine in the middle that manages the buffer (maybe using deque 在golang中是否有与”sliding-buffer chan”等效的功能?

huangapple
  • 本文由 发表于 2016年9月10日 16:57:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/39424385.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定