map[string](chan string)怎么初始化?

map[string](chan string) 其中chan string我想初始化成带长度的 ,该如何写呢?

已邀请:

xieyanke - 职业打杂儿,业余编程……

赞同来自:

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

h12 - https://h12.io

赞同来自: kekemuyu

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.

h12 - https://h12.io

赞同来自:

buffered chan string还是chan string类型啊!

kekemuyu - 简单就好

赞同来自:

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

kekemuyu - 简单就好

赞同来自:

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

xieyanke - 职业打杂儿,业余编程……

赞同来自:

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

kekemuyu - 简单就好

赞同来自:

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

kekemuyu - 简单就好

赞同来自:

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

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的,有没有办法一开始就初始化好

lrita

赞同来自:

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

lichao2018

赞同来自:

x := map[string] chan string { "3": make(chan string, 3), "4": make(chan string, 4) }

要回复问题请先登录注册