通道元素类型太大Golang

时间:2017-05-24 12:04:19

标签: arrays matrix go channel goroutine

我正在编写一个并行处理矩阵的程序。

我的矩阵是使用常量n创建的。

const n = 10

使用以下代码创建频道:

a := make(chan [n][n]int)

12 n左右channel element type too large (>64kB) 值以下的任何值都可以正常工作,但是会有更大的值和以下错误:

a := make(chan [n][n]int, 1000)

查看教程等,似乎缓冲通道可能是解决此问题的方法,但我尝试使用以下代码执行此操作并给出了相同的错误:

const n int = 1024

blank [n][n]int

我是否正确使用缓冲通道,或者它们不是解决此问题的方法?关于如何向前推进的任何提示都非常感激。

编辑:继续给出答案和评论我现在正在尝试创建一个空白的全局矩阵,并且例程可以写入。

<input type="text" name="product[]">
<input type="text" name="cost[]">

我不确定如何在全球范围内宣布它,并尝试了上述方法来解决这个问题。是否需要全球初始化?我似乎尝试的所有东西都会出错。

1 个答案:

答案 0 :(得分:2)

被缓冲的通道与此无关,错误不在于存储元素的空间,而在于单个元素的大小。通道元素类型的大小限制是一个实现细节/限制,你无法做任何事情。

如果你试图使用违反这个的元素类型,那就表明你做错了什么(你不应该这样做)。无论何时在通道上发送值,都将复制该值。因此,在通道上发送&gt; 64KB值并不是真正有效。

而是选择一个小的元素类型。需要最少更改的选择是使用指向您的类型的指针:*[n][n]int

a := make(chan *[n][n]int)

当然,你必须在频道上发送指针,然后你会收到它的指针,例如:

const n = 132
a := make(chan *[n][n]int)

go func() {
    var v [n][n]int
    a <- &v // Sending a pointer
}()

v2 := <-a
fmt.Println(v2)  // It's a pointer
fmt.Println(*v2) // It's an array value

Go Playground上尝试。

你还应该记住,既然现在我们在通道上发送/接收指针,它将指向相同的数组值,因此修改指向的值将修改我们在通道上发送的地址的同一个数组。如果这是不需要的,请在发送之前制作副本,然后发送副本的地址:

var v [n][n]int
// Making a copy:
v2 := v
a <- &v2 // Sending address of the copy

您还应该考虑使用slices代替arrays

修改

声明全局数组就像这样简单:

var result [n][n]int

(它必须在文件范围内的其他块之外。)