Golang 创建一个单向发送通道,并将其传递给一个返回单向接收通道的函数

Golang 创建一个单向发送通道,并将其传递给一个返回单向接收通道的函数

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

步骤

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

  • 使用close函数关闭通道。

  • 定义一个receiver函数,接受一个只接收通道,类型为int,以及一个只发送通道,类型为bool。

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

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

  • 一旦通道关闭,发送true值到”done”通道,标记接收函数的完成。

  • 在main函数中():

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

    • 使用make函数创建一个名为”done”的布尔类型只发送通道。

    • 通过从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.

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程