首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go:数组的数组,切片的数组,数组的切片和切片的切片

Go:数组的数组,切片的数组,数组的切片和切片的切片
EN

Stack Overflow用户
提问于 2012-11-22 02:40:12
回答 2查看 1.2K关注 0票数 4

试着自学,发现很难找到例子,我的大脑已经打结了。非常不确定3和4,需要帮助使5工作。

代码语言:javascript
复制
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")
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-22 03:12:36

第3部分起作用。

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

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

在每个元素都是[len(a)]int的情况下,b[:]被计算为一个切片。如果添加另一个[:],则会再次对切片进行切片。因为对于任何片s,s[:] == s,它都是一个no op。

第5部分,您可以对切片数组进行切片。

代码语言:javascript
复制
println("5. Slice of slices:")
var e [][]int
e = d[:]
fmt.Println(e, "\n")

我在http://play.golang.org/p/WDvJXFiAFe上发布了一个完整的示例。

票数 6
EN

Stack Overflow用户

发布于 2012-11-22 21:32:36

答案是“这真的有效吗?”这取决于您所期望的内容。考虑一下http://play.golang.org/p/7Z5hKioTI_的这个例子

代码语言:javascript
复制
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")
}

它展示了切片如何具有底层数组,以及您的操作中的示例如何使用相同的底层数组制作切片。如果希望切片具有独立的内容,则必须制作新切片并复制数据。(或者有一些附加的技巧...)

另请注意,println将数据发送到stderr而不是stdout,并以不同于fmt.Println的方式格式化某些数据类型。为了避免混淆,最好保持使用fmt.Println的习惯。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13499923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档