English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основы Golang

Управляющие операторы Golang

Функции и методы Golang

Структуры Golang

Срезы и массивы Golang

Строки (String) Golang

Указатели Golang

Интерфейсы Golang

Конкурентоспособность Golang

Ошибки (Error) Golang

Другие темы Golang

Односторонний канал в Go

Известно, что канал является средством коммуникации между параллельно выполняющимися 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

Использование одностороннего канала:Односторонний канал предназначен для обеспечения типовой безопасности программы, что позволяет уменьшить количество ошибок, возникающих в программе. Или, если вы хотите создать канал, который может только отправлять или принимать данные, также можно использовать односторонний канал.