2016-10-16 16 views
1

寻找golang's 2D slices和无法理解在最后一个例子中使用的语法:这个“常用成语”究竟是如何运作的?在文档

func main() { 
    XSize := 5 
    YSize := 5 

    // Allocate the top-level slice, the same as before. 
    picture := make([][]uint8, YSize) // One row per unit of y. 

    // Allocate one large slice to hold all the pixels. 
    pixels := make([]uint8, XSize*YSize) // Has type []uint8 even though picture is [][]uint8. 

    // Loop over the rows, slicing each row from the front of the remaining pixe ls slice. 
    for i := range picture { 
     picture[i], pixels = pixels[:XSize], pixels[XSize:] 
    } 
} 

我发现如果这被添加到文档和变化笔者有这个正常/易于理解的代码change request

// Loop over the rows, slicing each row. 
for i := range picture { 
    picture[i] = pixels[i*XSize:(i+1)*XSize] 

然而,有这样的评论:

罚款。另一种常见的成语是为了避免数学:

picture[i], pixels = pixels[:XSize], pixels[XSize:]

我的问题是如何在上述实现同为“避免数学”方法?一些关于发生的事情的文档将会很棒。

回答

5

此:

picture[i], pixels = pixels[:XSize], pixels[XSize:] 

是一个元组assignment。它为picture[i]赋值,并为pixels赋值。按顺序分配的值是pixels[:XSize]pixels[XSize:]

该作业分两个阶段进行。首先,左边的index expressionspointer indirections(包括selectors中的隐式指针间接)的操作数和右边的表达式都是evaluated in the usual order。其次,作业按照从左到右的顺序进行。

这里发生的是,当在循环开始(i = 0),picture(第一行)的第一个元素被分配与切片值是所述第一XSize元件pixels,并且pixels切片resliced所以其第一个元素将是XSizeth元素+1。

所以在下一迭代picture[i]将是picture(第2行)的第二元件,同样,从pixels第一XSize元件将被设置为它作为一个切片。但是由于在前一次迭代中我们解决了pixels,在每次迭代中它的第一个XSize元素将成为后续行。

+0

敬畏的权利。完全合理。'(picture [i],pixels)=(pixels [:XSize],pixels [XSize:])'。只是没有看到这种方式。 – Jonathan

2

这个元组分配的例子可以写成这样:

for i := range picture { 
    picture[i]= pixels[:XSize] 
    pixels = pixels[XSize:] 
} 

现在可以更轻松地看到,图片这是第一XSIZE项目像素

像素在每个循环被修改并丢弃其第一XSIZE项目。