English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Известно, что канал является средством коммуникации между параллельно выполняющимися goroutine, поэтому они могут отправлять и принимать данные друг другу. По умолчанию канал является двусторонним, но вы также можете создать односторонний канал. Канал, который может только принимать данные или только отправлять данные, являетсяОдносторонний канал. Односторонний канал также можно создать с помощью функции make(), как показано ниже:
// Используется только для приема данных c1 := make(<- chan bool) // Используется только для отправки данных c2 := make(chan<- bool)
Пример использования одностороннего канала 1:
package main import "fmt" func main() { // Используется только для приема данных mychanl1 := make(<-chan string) // Используется только для отправки данных mychanl2 := make(chan<- string) // Показ типов канала fmt.Printf("%T", mychanl1) fmt.Printf("\n%T", mychanl2) }
Вывод:
<-chan string chan<- string
В языковом синтаксисе Go разрешается преобразовывать двусторонний канал в односторонний канал, другими словами, вы можете преобразовать двусторонний канал в канал только для приема или только для отправки данных, но также и наоборот. Как показывают下面的 программы:
package main import "fmt" func sending(s chan<- string) { s <- "w3codebox" } func main() { // Создание двустороннего канала mychanl := make(chan string) // В этом примере функция sending() преобразует двусторонний канал в канал только для отправки go sending(mychanl) // В этом примере канал отправляется только внутри goroutine, а вне goroutine канал является двусторонним, поэтому он выводит w3codebox fmt.Println(<-mychanl) }
Вывод:
w3codebox
Использование одностороннего канала:Односторонний канал предназначен для обеспечения типовой безопасности программы, что позволяет уменьшить количество ошибок, возникающих в программе. Или, если вы хотите создать канал, который может только отправлять или принимать данные, также можно использовать односторонний канал.