新手问题 map[string](chan string)怎么初始化?

kekemuyu · 2018年04月14日 · 最后由 lichao2018 回复于 2018年04月16日 · 521 次阅读

mapstring 其中 chan string 我想初始化成带长度的 ,该如何写呢?

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

buffered chan string 还是 chan string 类型啊!

类型是没变,但是初始化成有缓冲的是我的业务需要。我现在的解决办法是在 map[string] 的 string 确定后再初始化后面的 chan string。有没有办法一开始就把 chan string 初始化了

定义 map 中 chan 类型带 buffer 长度没有任何意义,所以在定义 map 时语法上无法实现你的需求,主要是没有带长度的必要。

为何说没有意义呢?如果传给 chan string 的量超过一个不就阻塞了吗,如果有 buffer 可以缓冲,不至于阻塞呀

对于 chan 来说 buffer 是有意义的,但是在定义 map 的时候不定义 buffer len 也是可以传递有 buffer 的 chan 的,所以为何要定义?

楼上好像没明白我的意思,请看以一下我三楼的回答 “我现在的解决办法是在 map[string] 的 string 确定后再初始化后面的 chan string。有没有办法一开始就把 chan string 初始化了” 我不是要给它传一个带 buffer 的 chan string,我是直接给它传 string 的

可能我直接说,大家不太明白。举个例子:

package main

import (
    "fmt"
)

var mapchan map[string]chan string

func main() {
    mapchan = make(map[string]chan string)
    mapchan["a"] = make(chan string, 10)
    mapchan["a"] <- "a"
    defer close(mapchan["a"])
    fmt.Println(mapchan["a"])

    mapchan["b"] = make(chan string, 10)
    mapchan["b"] <- "b"
    defer close(mapchan["b"])
    fmt.Println(mapchan["b"])
    <-mapchan["a"]
    <-mapchan["b"]
}

map 中的 chan string 我只能在 map[string] 中的 string 确定后,再把 chan string 一个一个的 make 成带 buffer 的,有没有办法一开始就初始化好

不要试图用代码技巧掩盖设计问题。

type ChanMap struct {
    m map[string]chan string
}

func NewChanMap() *ChanMap {
    return &ChanMap{m: make(map[string]chan string)}
}

func (cm *ChanMap) Chan(key string) chan string {
    if ch, ok := cm.m[key]; ok {
        return ch
    }
    ch := make(chan string, 10)
    cm.m[key] = ch
    return ch
}

We can solve any problem by introducing an extra level of indirection, except for the problem of too many levels of indirection.

x := map[string] chan string { "3": make(chan string, 3), "4": make(chan string, 4) }
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册