Каналы Голанга основаны на LIFO?

Мне было интересно, относительно порядка элементов в каналах Голанга. После запуска нескольких примеров кажется, что порядок, в котором элементы выходят из канала, является "последним первым обслужен". Я прав?

Следующий фрагмент - пример, который я использовал. После выполнения кода на выходе будет 20 10, а 10 отправлено на канал первым, а 20 последним.

package main

import "fmt"

func multiply(c chan int, num int) {
    c <- num * 10
}

func main() {
    c := make(chan int)

    go multiply(c, 1)
    go multiply(c, 2)

    v1 := <-c
    v2 := <-c
    fmt.Println(v1, v2)
}

1 ответ

Решение

Каналы Голанга не ЛИФО.

Каналы действуют как очереди "первым пришел - первым вышел". Например, если одна программа отправляет значения по каналу, а вторая программа получает их, значения принимаются в порядке отправки.

Значения, отправленные по каналу, будут приниматься всякий раз, когда получатель канала готов. А если нет, то он заблокирует. Для управления этим вы можете перейти на буферизованные каналы.

Приведенный ниже код проверит, доступны ли значения для получения из канала.

package main

import "fmt"

func multiply(c chan int, num int) {
    c <- num * 10
}

func main() {
    c := make(chan int, 3)

    go multiply(c, 1)
    go multiply(c, 2)
    go multiply(c, 3)

    for i:=0;i<3;i++{
         foo, ok := <- c
         if !ok {
                fmt.Println("done")
                return
         }
         fmt.Println(foo)
    }

}

Рабочий код на игровой площадке Go

Буферизованные каналы

Каналы могут быть буферизованы. Укажите длину буфера в качестве второго аргумента для инициализации буферизованного канала:

make(chan int, 100)

Емкость, в количестве элементов, устанавливает размер буфера в канале. Если пропускная способность равна нулю или отсутствует, канал не буферизуется, и связь устанавливается только тогда, когда отправитель и получатель готовы. В противном случае канал буферизуется, и связь успешно завершается без блокировки, если буфер не заполнен (отправляет) или не пуст (получает). Нулевой канал никогда не готов к общению.

В вашем случае это зависит от того, какая подпрограмма go сначала отправит значение на канал. Значения, которые вы печатаете, полностью зависят от стандартных процедур.

Для получения дополнительной информации перейдите по каналам Голанг

Другие вопросы по тегам