Go 语言程序:创建单向发送通道并将其传递给返回单向接收通道的函数


单向发送通道用于向通道发送值,而单向接收通道用于从通道接收数据。这些通道用于并发数据处理、数据共享等。在这篇 Go 语言文章中,我们将创建一个程序,创建一个单向发送通道并将其传递给一个函数,该函数使用函数参数、类型转换以及通道组合返回一个单向接收通道。

算法

  • 定义一个名为“sender”的发送者函数,该函数接受一个名为“ch”的类型为整数的只发送通道。

  • 使用 close 函数关闭通道。

  • 定义一个名为“receiver”的接收者函数,该函数接受一个类型为 int 的只接收通道和一个类型为 bool 的只发送通道。

  • 使用 range 关键字迭代从“ch”通道接收到的值。

  • 使用“fmt.println”函数打印接收到的值。

  • 通道关闭后,向“done”通道发送 true 值以标记接收者函数的完成。

  • 在 main 函数() 中

    • 使用 make 函数创建一个名为“sendch”的类型为整数的通道。

    • 使用 make 函数创建一个名为“done”的类型为布尔值的“sendonly”通道。

    • 通过从 done 通道接收值来等待接收者完成。

    • 现在使用“fmt.println”函数打印“程序已终止”。

示例 1

此示例创建了两个函数,用于创建单向发送通道以及接受单向发送通道。以下代码演示了如何使用单向通道在 goroutine 之间发送和接收数据。

package main

import "fmt"

func sender(ch chan<- int) {
   ch <- 32
   close(ch)
}

func receiver(ch <-chan int, done chan<- bool) {
   for val := range ch {
      fmt.Println(val)
   }
   done <- true
}

func main() {
   sendCh := make(chan int) 
   done := make(chan bool)  

   go sender(sendCh)
   go receiver(sendCh, done) 

   <-done // Wait for receiver to finish

   fmt.Println("Program is terminated.")
}

输出

32
Program is terminated.

示例 2

此示例涉及创建双向通道并使用类型转换将其转换为单向发送/接收通道。以下代码使用通道来协调 goroutine 之间的数据发送和接收。

package main

import (
   "fmt"
   "sync"
)

func sender(ch chan<- int, wg *sync.WaitGroup) {
   ch <- 32
   close(ch)
   wg.Done()
}

func receiver(ch <-chan int, wg *sync.WaitGroup) {
   for val := range ch {
   fmt.Println(val)
   }
   wg.Done()
}

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

   var wg sync.WaitGroup
   wg.Add(2)

   go sender(ch, &wg)
   go receiver(ch, &wg)

   wg.Wait()

   fmt.Println("Program is terminated.")
}

输出

32
Program is terminated. 

方法 3:使用通道组合

示例

在此示例中,使用“<-“运算符组合通道。它可以创建复合通道以组合发送和接收通道类型。以下代码显示了在 Go 语言中使用只发送通道和只接收通道。

package main

import (
   "fmt"
   "sync"
)

type SendOnlyChannel chan<- int
type ReceiveOnlyChannel <-chan int

func sender(ch chan<- int, wg *sync.WaitGroup) {
   ch <- 22
   close(ch)
   wg.Done()
}

func receiver(ch <-chan int, wg *sync.WaitGroup) {
   for val := range ch {
      fmt.Println(val)
   }
   wg.Done()
}

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

   var sendOnly SendOnlyChannel = sendCh
   var recvOnly ReceiveOnlyChannel = sendCh

   var wg sync.WaitGroup
   wg.Add(2)

   go sender(sendOnly, &wg)
   go receiver(recvOnly, &wg)

   wg.Wait()

   fmt.Println("Program is terminated.")
}

输出

22
Program is terminated.

结论

在本文中,我们讨论了单向通道是控制数据流和防止未经授权使用的有效工具。我们探讨了三种不同的方法,包括类型转换、通道组合以及类型转换。

更新于: 2023-07-13

98 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告