4

独学で例を見つけるのが難しく、私の脳はすでに結び目になっています。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")
}
4

2 に答える 2

6

パート 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に投稿しました。

于 2012-11-21T19:12:35.517 に答える
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 はデータを stdout ではなく stderr に送信し、一部のデータ型を fmt.Println とは異なる方法でフォーマットします。混乱を避けるために、fmt.Println を使用する習慣を維持することをお勧めします。

于 2012-11-22T13:32:36.347 に答える