试着教自己,发现很难找到例子,我的大脑已经结束了。非常不确定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")
}
答案 0 :(得分: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 :(得分: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的习惯。