加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Go语言上chan通道有什么作用

发布时间:2023-07-08 12:54:49 所属栏目:语言 来源:
导读:这篇文章主要介绍了Go语言中chan通道有什么作用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中chan通道有什么作用文章都会有所收获,下面我们一起来看看吧。

在Go语言中
这篇文章主要介绍了Go语言中chan通道有什么作用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中chan通道有什么作用文章都会有所收获,下面我们一起来看看吧。
 
在Go语言中,通道(chan)是goroutine之间通信的管道,是goroutine与另一个goroutine通信的媒介。通道是一种技术,它允许一个goroutine将数据发送到另一个goroutine;默认情况下,通道是双向的,这意味着goroutine可以通过同一通道发送或接收数据。
 
在Go语言中,通道(chan)是goroutine之间通信的管道,是goroutine与另一个goroutine通信的媒介,并且这种通信是无锁的。换句话说,通道是一种技术,它允许一个goroutine将数据发送到另一个goroutine。默认情况下,通道是双向的,这意味着goroutine可以通过同一通道发送或接收数据,如下图所示:
 
Go语言中chan通道有什么作用
 
Go语言提倡使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。
 
这里通信的方法就是使用通道(channel),如下图所示。
 
Go语言中chan通道有什么作用
 
图:goroutine 与 channel 的通信
 
在地铁站、食堂、洗手间等公共场所人很多的情况下,大家养成了排队的习惯,目的也是避免拥挤、插队导致的低效的资源使用和交换过程。代码与数据也是如此,多个 goroutine 为了争抢数据,势必造成执行的低效率,使用队列的方式是最高效的,channel 就是一种队列一样的结构。
 
通道的特性
 
Go语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。goroutine 间通过通道就可以通信。
 
通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。
 
创建通道
 
在Go语言中,使用chan关键字创建通道,并且该通道只能传输相同类型的数据,不允许从同一通道传输不同类型的数据。
 
语法:
 
var Channel_name chan Type
 
您还可以使用简写声明通过make()函数创建通道。
 
语法:
 
channel_name:= make(chan Type)
 
示例
 
package main
 
import "fmt"
 
func main() {
 
    //使用var关键字创建通道
 
    var mychannel chan int
 
    fmt.Println("channel的值: ", mychannel)
 
    fmt.Printf("channel的类型: %T ", mychannel)
 
    // 使用 make() 函数创建通道
 
    mychannel1 := make(chan int)
 
    fmt.Println("\nchannel1的值:", mychannel1)
 
    fmt.Printf("channel1的类型: %T ", mychannel1)
 
}
 
输出:
 
channel的值:  <nil>
 
channel的类型: chan int
 
channel1的值: 0xc0000160c0
 
channel1的类型: chan int
 
从通道发送和接收数据
 
在Go语言中,通道工作有两个主要的操作,一个是发送,另一个是接收,这两个操作统称为通信。<-运算符的方向表示是接收数据还是发送数据。在通道中,默认情况下,发送和接收操作块直到另一端没有数据为止。它允许goroutine在没有显式锁或条件变量的情况下彼此同步。
 
1、发送操作:发送操作用于在通道的帮助下将数据从一个goroutine发送到另一个goroutine。像int,float64和bool之类的值可以安全且容易地通过通道发送,因为它们是被复制的,因此不存在意外并发访问相同值的风险。同样,字符串也是安全的,因为它们是不可变的。但是,通过通道发送指针或引用(例如切片,map集合等)并不安全,因为指针或引用的值可能会通过同时发送goroutine或接收goroutine更改,并且结果无法预测。因此,在通道中使用指针或引用时,必须确保它们一次只能由一个goroutine访问。
 
Mychannel <- element
 
上面的语句表明数据(element)在<-运算符的帮助下发送到通道(Mychannel)。
 
2、接收操作:接收操作用于接收发送操作方发送的数据。
 
element := <-Mychannel
 
上面的语句表明该元素从channel(Mychannel)接收数据。如果接收到的语句的结果不可用(不需要使用),则也是有效的语句。您还可以编写如下的receive语句:
 
<-Mychannel
 
示例
 
package main
 
 
 
import "fmt"
 
  
 
func myfunc(ch chan int) {
 
  
 
    fmt.Println(234 + <-ch)
 
}
 
func main() {
 
    fmt.Println("主方法开始")
 
    //创建通道l
 
    ch := make(chan int)
 
  
 
    go myfunc(ch)
 
    ch <- 23
 
    fmt.Println("主方法结束")
 
}
 
输出:
 
主方法开始
 
257
 
主方法结束
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!