Go в примери: Складиране в канали

По подразбиране каналите са нескладиращи1, което означава, че ще приемат изпратени данни (chan <-) само ако има някой готов да ги получи (<- chan). складиращите канали2 приемат ограничено количество стойности без да има готов получател за тези стойности.


  1. buffered channel – канал, складиращ/задържащ в себе си по повече от една стойност от вида на канала данни, буфериран
  2. unbuffered channel – нескладиращ канал – такъв, през който може да минава само една стойност наведнъж, небуфериран.
package main
import "fmt"
func main() {

Тук правим (make) канал за низове с вместимост до две стойности.

    messages := make(chan string, 2)

Понеже този канал е складиращ, можем да изпратим тези стойности по канала без съответстващо едновременно1 работещо за всяко изпращане получаване.


  1. concurrent – едновременно (изпълняваща се задача)
    messages <- "складиращ"
    messages <- "канал"

По-късно можем да получим тези две стойности както обикновено.

    fmt.Println(<-messages)
    fmt.Println(<-messages)
}
$ go run channel-buffering.go
складиращ
канал

Следващ пример: .