2016-10-01 50 views
15

我正在学习去通过A Tour of Go去。其中一个练习要求我创建一个包含uint8的行的dy行和dx列的2D切片。我目前的做法是这样的:在Go中创建2D切片的简洁方法是什么?

a:= make([][]uint8, dy)  // initialize a slice of dy slices 
for i:=0;i<dy;i++ { 
    a[i] = make([]uint8, dx) // initialize a slice of dx unit8 in each of dy slices 
} 

我认为遍历每个片来初始化它太冗长。如果切片具有更多维度,则代码将变得笨拙。有没有一种简洁的方式来初始化Go中的2D(或n维)切片?

回答

25

没有一种更简洁的方式,你做了什么是“正确”的方式;因为切片总是一维的,但可以组成构造更高维的对象。看到这个问题的更多细节:Go: How is two dimensional array's memory representation

有一两件事你可以在它简化是使用for range结构:

a := make([][]uint8, dy) 
for i := range a { 
    a[i] = make([]uint8, dx) 
} 

还要注意的是,如果你有一个composite literal初始化片,你得到这个“免费”,例如:

a := [][]uint8{ 
    {0, 1, 2, 3}, 
    {4, 5, 6, 7}, 
} 
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]] 

是的,这有其局限性,因为看似你必须列举所有元素;但是有一些技巧,也就是说你不必枚举所有的值,只有那些不是片的元素类型的zero values。有关详细信息,请参见Keyed items in golang array initialization

例如,如果你想要一个切片,其中前10个元素是零,然后遵循 12

,它可以这样创建:

b := []uint{10: 1, 2} 
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2] 

还要注意的是,如果你使用arrays代替的slices,它可以创建非常容易:

c := [5][5]uint8{} 
fmt.Println(c) 

输出是:

[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] 

对于数组,您不必迭代“外部”数组并初始化“内部”数组,因为数组不是描述符而是值。有关更多详细信息,请参阅博客文章Arrays, slices (and strings): The mechanics of 'append'

试试Go Playground上的例子。

0

您可以参考这一段代码 -

package main 

import "fmt" 

func main() { 
    var row, col int 
    fmt.Print("enter rows cols: ") 
    fmt.Scan(&row, &col) 

    // allocate composed 2d array 
    a := make([][]int, row) 
    for i := range a { 
     a[i] = make([]int, col) 
    } 

    // array elements initialized to 0 
    fmt.Println("a[0][0] =", a[0][0]) 

    // assign 
    a[row-1][col-1] = 7 

    // retrieve 
    fmt.Printf("a[%d][%d] = %d\n", row-1, col-1, a[row-1][col-1]) 

    // remove only reference 
    a = nil 
    // memory allocated earlier with make can now be garbage collected. 
} 

Reference

+3

除了'range',我看不出什么的任择议定书要求的差异,你的示例代码。 – eduncan911

-1

我写这个函数来交换一个二维数组的行:

func lchange(l1 int, l2 int, a [][]float64) { 
    b := make([]float64, 1) 
    b = a[l1][:] 
    a[l1] = a[l2] 
    a[l2] = b 
} 
+0

这与问题无关。 – hazrmard

相关问题