码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • GO channel 学习


    引言

    单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。
    虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。


    Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而
    不是通过共享内存而实现通信。如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。


    Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出
    (First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也
    就是声明channel的时候需要为其指定元素类型。 

    1. package main
    2. import "fmt"
    3. // 类似于pipe[]管道
    4. func main() {
    5. //ch := make(chan int, 10) //有缓冲大小的管道
    6. //ch <- 12
    7. //var x int
    8. //x = <-ch
    9. //fmt.Println(x)
    10. //c := make(chan int) //开辟的空间 cap是3,长度
    11. //
    12. //go func() {
    13. // defer println("go 程关闭")
    14. // fmt.Println("go 程运行正在向chan写入数据")
    15. // c <- 666 //由于是无缓冲的,所以必须得立刻接收,不然一直阻塞
    16. //}()
    17. //num := <-c
    18. //fmt.Println("主程序接受管道 值为:", (num))
    19. //fmt.Println(len(c), cap(c))
    20. //ch := make(chan int)
    21. //go func() {
    22. // defer close(ch) //延迟关闭通道
    23. // for i := 0; i < 5; i++ {
    24. // ch <- i
    25. // }
    26. //}()
    27. //for {
    28. // if data, ok := <-ch; ok {
    29. // fmt.Println(data)
    30. // } else {
    31. // break
    32. // }
    33. //}
    34. /*
    35. c := make(chan int)
    36. go func() {
    37. for i := 0; i < 5; i++ {
    38. c <- i
    39. time.Sleep(1 * time.Second)
    40. }
    41. close(c)
    42. }()
    43. //迭代,会自动阻塞
    44. for data := range c {
    45. fmt.Println(data)
    46. }*/
    47. // select 多路复用
    48. c := make(chan int)
    49. quit := make(chan int)
    50. go func() {
    51. for i := 0; i < 5; i++ {
    52. fmt.Println(<-c)
    53. }
    54. quit <- 0
    55. }()
    56. fibonace(c, quit)
    57. }
    58. func fibonace(c, quit chan int) {
    59. x, y := 1, 1
    60. for {
    61. select {
    62. case c <- x: //如果c可写 ,x就会进来
    63. x, y = y, x+y
    64. case <-quit:
    65. fmt.Println("quit")
    66. return
    67. }
    68. }
    69. }

  • 相关阅读:
    PAT 甲级 A1021 Deepest Root
    [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(六)文件包含相关面试题
    【力扣每日一题】2023.9.17 打家劫舍Ⅱ
    拼接字符串,得到字典序最小的结果
    数组和对象的扩展运算符
    IDEA断点常用5种方式——条件断点(循环)、回退、表达式执行、中断(不执行后续代码)、指定异常(常用寻找空指针位置)
    Mysql日志管理
    android开发使用OkHttp自带的WebSocket实现IM功能
    Leetcode 01-算法入门与数组-②数组基础
    PostgreSQL逻辑备份与恢复
  • 原文地址:https://blog.csdn.net/wuxiaoyu0806/article/details/140364471
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号