cpp

Каналы только для записи

Объявление канала только для записи выполняется по следующей схеме:

var Название_канала chan<- Тип_данных

Пример инициализации каналов только для записи:

var ch chan<- int = make(chan<- int, 3)
fmt.Println(ch)        // 0xc000018180
fmt.Printf("%T\n", ch) // chan<- int
ch2 := make(chan<- int)
fmt.Println(ch2)       // 0xc0000181e0

Запишем данные в канал:

ch <- 10

Попробуем прочитать данные из канала:

fmt.Println(<-ch)

В результате получим сообщение об ошибке, т. к. канал доступен только для записи:

invalid operation: <-ch (receive from send-only type chan<- int)

Как же нам прочитать данные из канала? В данном случае никак. Но мы можем объявить однонаправленный канал как параметр функции и передавать в функцию двунаправленный канал (листинг 18.13). Преобразование типов каналов будет выполнено автоматически.

Листинг 18.13. Канал только для записи

package main

import "fmt"

func main() {
   var ch chan int = make(chan int)
   go test(ch)
   fmt.Println(<-ch)
   fmt.Println("Конец функции main()")
}
func test(ch chan<- int) {
   ch <- 20
   // fmt.Println(<-ch) // Ошибка! Читать нельзя!
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp