2012-11-21 106 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的习惯。