2012-11-21 147 views
3

試圖教自己,發現很難找到實例的片,我的大腦在一個結了。非常不確定3和4,需要幫助做5個工作。轉到:數組的數組,切片的陣列,陣列片和切片

package main 
import "fmt" 

func main() { 
    println("0. Array:") 
    var a = [...]int{4,5,6,7,8,9} //assign 
    fmt.Println(a,"\n") 

    println("1. Slice:") 
    var as []int 
    as = a[:] //assign 
    fmt.Println(as,"\n") 

    println("2. Array of arrays:") 
    var b [4][len(a)]int 
    for i:= range b { //assign 
     b[i]=a 
    } 
    fmt.Println(b,"\n") 

    println("3. Array of slices:") 
    var d [len(b)][]int 
    for i:= range b { // assign 
     d[i] = b[i][:] //does this really work? 
    } 
    fmt.Println(d,"\n") 

    println("4. Slice of arrays:") 
    var c [][len(a)]int 
    c = b[:][:] // assign, does this really work? 
    fmt.Println(c,"\n") 

    println("5. Slice of slices:") 
    var e [][]int 
// e = c // ??? 
    fmt.Println(e,"\n") 
} 

回答

5

第3部分工作。

部分4包含一個不必要的[:]

println("4. Slice of arrays:") 
var c [][len(a)]int 
c = b[:] // one [:], not two 
fmt.Println(c, "\n") 

b[:]評價爲切片,其中每個元素是一個[len(a)]int。如果添加另一個[:],則您正在再次切片。由於任何切片s,s[:] == s,這是一個沒有操作。

第5部分,您可以切片您的切片數組。

println("5. Slice of slices:") 
var e [][]int 
e = d[:] 
fmt.Println(e, "\n") 

我發佈了一個完整的示例http://play.golang.org/p/WDvJXFiAFe

1

「這真的有效嗎?」的答案取決於你的期望。考慮在http://play.golang.org/p/7Z5hKioTI_

package main 

import "fmt" 

func main() { 
    fmt.Println("0. Array:") 
    var a = [...]int{4, 5, 6, 7, 8, 9} //assign 
    fmt.Println(a, "\n") 

    fmt.Println("1. Slice:") 
    var as []int 
    as = a[:] //assign 
    fmt.Println(as, "\n") 

    fmt.Println("new slice:") 
    ns := make([]int, len(a)) 
    copy(ns, a[:]) 
    fmt.Print(ns, "\n\n") 

    fmt.Println("modifying array...") 
    a[0] = 10 
    fmt.Print("array is now:\n", a, "\n\n") 
    fmt.Print("slice is now:\n", as, "\n\n") 
    fmt.Print("new slice is still:\n", ns, "\n") 
} 

這個例子中它顯示了片如何有一個基本的陣列,並在你的OP的例子中使用相同的底層數組做切片。如果您希望切片具有獨立的內容,則必須製作新的切片並複製數據。 (或者有附加...的技巧)

另外,作爲一個附註,println將數據發送到stderr而不是stdout,並且格式化的數據類型與fmt.Println不同。爲避免混淆,最好保持使用fmt.Println的習慣。