当前位置: 首页 > 面试题库 >

make(chan bool)与make(chan bool,1)有何不同?

谢昂雄
2023-03-14
问题内容

我的问题来自尝试使用select语句读取(如果可以)或编写(如果可以)的通道。

我知道指定的通道make(chan bool, 1)被缓冲,并且我的问题的一部分是那之间的区别,并且make(chan bool)-
该页面说的内容与make(chan bool, 0)-–可以容纳0值的通道的意义是什么?它?

游乐场A

chanFoo := make(chan bool)

for i := 0; i < 5; i++ {
    select {
    case <-chanFoo:
        fmt.Println("Read")
    case chanFoo <- true:
        fmt.Println("Write")
    default:
        fmt.Println("Neither")
    }
}

输出:

Neither
Neither
Neither
Neither
Neither

(删除default外壳会导致死锁!)

现在看 游乐场B

chanFoo := make(chan bool, 1)   // the only difference is the buffer size of 1

for i := 0; i < 5; i++ {
    select {
    case <-chanFoo:
        fmt.Println("Read")
    case chanFoo <- true:
        fmt.Println("Write")
    default:
        fmt.Println("Neither")
    }
}

B输出:

Write
Read
Write
Read
Write

就我而言, B输出
就是我想要的。无缓冲通道有什么用?我在golang.org上看到的所有示例似乎都使用它们一次发送一个信号/值(这是我所需要的),但是就像在运动场A中一样,该通道永远不会被读取
写入。我对频道的了解缺少什么?


问题答案:

通道中可以容纳0值的点是什么

首先,我想指出的是,这里的第二个参数表示缓冲区大小,因此这只是一个没有缓冲区的通道(未缓冲的通道)。

实际上,这就是产生您的问题的原因。非缓冲通道仅在有人阻止读取时才可写,这意味着您将需要使用一些协程-而不是单个协程。

另请参阅Go内存模型:

来自未缓冲通道的接收发生在该通道上的发送完成之前。



 类似资料:
  • 2.5.1 什么是 make? 当你写一个简单的程序,只有一到两个源文件的时候,输入 % cc file1.c file2.c 就没什么问题,但如果有很多源文件就会很烦人──编译的时间也会很长。 一个方法就是使用目标文件,只在源文件有改变的情况下才重新编译源文件。 因此你可以这样做: % cc file1.o file2.o ... file37.c ... 上次编译后,file37.c

  • 另外一个非常有用的工具是make。在开发过程中,make只会重新编译那些上次make后发生了改变的模块。它也可以用于自动化其他任务。一些 常见的约定包括: all 执行所有二进制文件的构建过程 clean 删除所有中间文件 debug 构建一个测试用二进制文件a.out或debug depend 制作可传递的依赖关系 install 安装二

  • Ubuntu Make 前身是 Ubuntu Developer Tools Center。可在 Ubuntu 平台上快速安装各种语言的开发环境。

  • Make是一个Linux的实用工具,可以自动判断程序的哪一部分需要重新编译。一旦作出判断位需要重新编译,它输入必要的命令来完成。让经常被用来从源代码安装应用程序时,所以开放源码的开发者应该更了解这个工具,以及如何应用。如果您打算开发一个应用程序,可以从源代码安装,你需要知道如何创建一个Makefile文件。 这个Makefile中描述您的应用程序中各个文件的关系,包括需要的声明,将它们连着一起。如

  • make和Makefile GNU make(简称make)是一种代码维护工具,在大中型项目中,它将根据程序各个模块的更新情况,自动的维护和生成目标代码。 make命令执行时,需要一个 makefile (或Makefile)文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书写规则。以便给大家一个感兴认识。这个示例来源于gnu的make使用手册,在

  • Gitea 大量使用了 Make 工具来自动执行任务并改进开发,本文将介绍如何安装 Make。 在 Linux 环境下 可以使用包管理工具来安装 Make。 Ubuntu/Debian 环境,执行以下命令: sudo apt-get install make Fedora/RHEL/CentOS,执行以下命令: sudo yum install make 在 Windows 环境下 您可以参照