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

Golang-在结构内部使用chan slice

桂嘉年
2023-03-14
问题内容

我正在尝试在结构内使用slice chan类型,类似于下面的代码。但是,当我尝试接收

test := <-c.slice

程序挂起。有没有办法做到这一点?

package main

import "fmt"

type blah struct {
    slice chan [][]int
}

func main() {

    slice := make([][]int, 3)
    c := blah{make(chan [][]int)}

    slice[0] = []int{1, 2, 3}
    slice[1] = []int{4, 5, 6}
    slice[2] = []int{7, 8, 9}

    go func() {
        test := <- c.slice
        test = slice
        c.slice <- test
    }()

    fmt.Println(<-c.slice)
}

问题答案:

goroutine中的第一行从通道接收,创建goroutine之后的main中的第一行也是如此。这意味着系统中仅有的两个goroutine都试图从slice通道接收,而没有人试图发送到其中。

更一般而言,问题是要使某人接收(消费),其他人必须同时发送(产生)。如果通道是缓冲的(在您的示例中不是这种情况),则发送也可能在同一goroutine中提前发生。

举例来说,这是可行的,因为通道的缓冲区只有一个元素,这意味着发送不会阻塞:

ch := make(chan int, 1)
ch <- 1
i := <-ch

这也很好,因为发送与接收同时发生:

ch := make(chan int)
go func() { ch <- 1 }()
i := <-ch

这并 没有 工作,因为这两个够程要发送到的缓冲通道,没有人试图获得:

ch := make(chan int)
go func() { ch <- 1 }()
ch <- 2

这并 没有 任何工作,因为两者都够程尝试接收,没有人试图发送:

ch := make(chan int)
go func() { <-ch }()
<-ch

最后一个是你的情况。



 类似资料:
  • 问题内容: 如果我的猜测正确的话,我可能会遇到结构问题,可能还会遇到指针问题。 该结构具有一些字段和一个包含切片的字段: 这看起来是这样的: 我的问题是将的值更改为。 有一个监听连接的方法: 并且是无法正常工作的部分,该方法如下所示: 这实际上被执行了,所以连接没有得到响应或其他问题不是问题。 但是,如果以后尝试使用的方法来遍历它,则总是出于某种原因(默认设置)。 我想我正在使用的是原始连接的副本

  • Go 语言中的结构体和 C 语言中结构体一样,都是用来保存一组 不同类型的数据 Go 语言中的结构体和 C 语言中结构体一样,都需要先定义结构体类型再利用结构体类型定义结构体变量 定义结构体类型 type 类型名称 struct{ 属性名称 属性类型 属性名称 属性类型 ... ... } type Studentstruct { name string age int

  • 根据我对Netty的理解,传入消息传递给eventLoop(只有一个eventLoop,一个线程)。接下来,EventLoop不处理它,而是将其传递给ExecutorService(它在池中保存多个线程)执行。 所有这些都是在NIO的帮助下实现的。EventLoop等待传入消息,并通过选择器、键、通道等传递消息。 我说的对吗? 使用Netty 4

  • CInode CInode 包含某一文件的元数据,每个文件都有一个 CInode 。它存储着类似谁拥有这个文件、此文件有多大这样的信息。 CDentry CDentry 用于把索引节点和文件(或目录)名关联到一起。一个 CDentry 最多可链接到一个 CInode (也可以不链接任何 CInode ),一个 CInode 可被多个 CDentry 链接。 CDir CDir 仅存在于目录索引节点

  • 问题内容: 我对初始化包含映射的结构的最佳方法感到困惑。运行此代码将产生: 另一个想法是使用一种可以在地图为空的情况下对其进行初始化的方法: 还有其他选择吗?只是想看看是否有一种普遍接受的方法。 问题答案: 我可能会使用构造函数来做到这一点: 我已经在标准包中找到了这个示例(虽然没有地图,但是有切片):

  • 问题内容: 我在header.h内部定义了一个结构,如下所示: 当我用这种结构初始化一个对象时,我可以访问整数/双精度数,但不能访问数组。 如何访问读/写中的值? 问题答案: 最简单的方法是将数组包装在内,然后可以提供额外的方法来满足“可订阅”的要求。 我整理了一个小例子。假定您使用的是C ++,但是从中构造等效的C版本相当简单,它只需要重复一些即可。 首先,具有要包装的C ++头文件和用于包装固