我正在编写一个并行处理矩阵的程序。
我的矩阵是使用常量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[]">
我不确定如何在全球范围内宣布它,并尝试了上述方法来解决这个问题。是否需要全球初始化?我似乎尝试的所有东西都会出错。
答案 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
修改强>
声明全局数组就像这样简单:
var result [n][n]int
(它必须在文件范围内的其他块之外。)