为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中编写独特频道的正确方法是什么?

在 Go 中编写独特频道的正确方法是什么?

Go
BIG阳 2021-08-10 15:04:48
我是围棋初学者。我试图找出一种简单的方法来实现只输出不同值的通道。我想做的是这样的:package exampleimport (    "fmt"    "testing")func TestShouldReturnDistinctValues(t *testing.T) {    var c := make([]chan int)    c <- 1    c <- 1    c <- 2    c <- 2    c <- 3    for e := range c {        // only print 1, 2 and 3.        fmt.println(e)          }}如果我要使用地图来记住以前的值,我是否应该担心内存泄漏?
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

你真的不能那样做,你必须以某种方式跟踪这些值,amap[int]struct{}可能是最有效的内存方式。


一个简单的例子:


func UniqueGen(min, max int) <-chan int {

    m := make(map[int]struct{}, max-min)

    ch := make(chan int)

    go func() {

        for i := 0; i < 1000; i++ {

            v := min + rand.Intn(max)

            if _, ok := m[v]; !ok {

                ch <- v

                m[v] = struct{}{}

            }

        }

        close(ch)

    }()


    return ch

}


查看完整回答
反对 回复 2021-08-10
?
largeQ

TA贡献2039条经验 获得超7个赞

我以前做过类似的事情,除了我的问题是按升序输出输入。你可以通过添加一个中间 go 例程来做到这一点。这是一个例子:


package main


func main() {

    input, output := distinct()


    go func() {

        input <- 1

        input <- 1

        input <- 2

        input <- 2

        input <- 3

        close(input)

    }()


    for i := range output {

        println(i)

    }

}


func distinct() (input chan int, output chan int) {

    input = make(chan int)

    output = make(chan int)


    go func() {

        set := make(map[int]struct{})

        for i := range input {

            if _, ok := set[i]; !ok {

                set[i] = struct{}{}

                output <- i

            }

        }

        close(output)

    }()

    return

}


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信