2017-02-24 3 views
0

Ich möchte einige Kanäle basierend auf einer Zeichenfolge indizieren. Ich verwende eine Karte, aber es wird mir nicht erlauben, einen Kanal zuzuweisen. Ich bekomme immer "Panik: Zuweisung zum Eintrag in der Karte", was fehlt mir?Golang. Karte der Kanäle

package main 

import "fmt" 

func main() { 
    var things map[string](chan int) 
    things["stuff"] = make(chan int) 
    things["stuff"] <- 2 
    mything := <-things["stuff"] 
    fmt.Printf("my thing: %d", mything) 
} 

https://play.golang.org/p/PYvzhs4q4S

+4

Sie initialisieren eine Karte mit 'make' oder einem Kartenliteral. Vielleicht gehen Sie durch die ["Tour of Go"] (https://tour.golang.org/), die alle Grundlagen abdeckt. – JimB

+0

Nur eine kleine Klarstellung, falls: Der Nullwert einer Karte ist Null. Wie die Antwort sagt, müssen Sie es mit 'make' initialisieren. – threeve

Antwort

5

Zuerst müssen Sie die Karte initialisieren. Etwas wie:

things := make(map[string](chan int)) 

Eine andere Sache, Sie senden und versuchen, von einer ungepufferten Kanal zu verbrauchen, so wird das Programm blockiert werden. Also kann man einen gepufferten Kanal benutzen oder senden/konsumieren in einer Goroutine.

verwendete ich einen gepufferten Kanal hier:

package main 

import "fmt" 

func main() { 
    things := make(map[string](chan int)) 

    things["stuff"] = make(chan int, 2) 
    things["stuff"] <- 2 
    mything := <-things["stuff"] 
    fmt.Printf("my thing: %d", mything) 
} 

Spielplatz link: https://play.golang.org/p/DV_taMtse5

Der make(chan int, 2) Teil bildet den Kanal mit einer Pufferlänge von 2. gepufferte Mehr darüber hier: https://tour.golang.org/concurrency/3

+0

Aus Neugier, warum haben Sie' chan int' in Klammern gesetzt? Die Syntax 'make (map [string] chan int)' funktioniert einwandfrei. –

+0

Sogar etwas wie 'map [string] chan int {}' funktioniert. –

+1

Oh, es war im ursprünglichen Code. Ich habe nur die Teile modifiziert, die ich modifizieren musste. – masnun

Verwandte Themen