cpp

Каналы только для чтения

До этого момента мы рассматривали двунаправленные каналы, которые позволяют как записывать данные в канал, так и читать данные из канала. В языке Go существуют также однонаправленные каналы, которые позволяют только записывать данные или только читать данные.

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

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

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

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

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

ch <- 10

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

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

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

Листинг 18.12. Канал только для чтения

package main

import "fmt"

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

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

Помощь сайту

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

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

cpp