4

GO言語ではスライスは参照渡しだと思っていました。しかし、次のコードがスライス c の内容を変更しないのはなぜでしょうか? 何か不足していますか?ありがとうございました。

package main

import (
    "fmt"
)


func call(c []int) {
    c = append(c, 1)
    fmt.Println(c)
}

func main() {
    c := make([]int, 1, 5)
    fmt.Println(c)
    call(c)
    fmt.Println(c)
}

印刷された結果は次のとおりです。

[0] [0 1] [0]

期待している間に

[0] [0 1] [0 1]

4

2 に答える 2

12

スライスの長さは、参照によって渡されないスライス ヘッダーに保持されます。スライスは、配列へのポインター、長さ、および容量を含む構造体と考えることができます。

スライスに追加するときに、データ配列のインデックス 1 を変更し、スライス ヘッダーの長さをインクリメントしました。あなたが戻ったときc、メイン関数の長さは1だったので、同じデータを出力しました。

スライスがこのように機能する理由は、同じデータを指す複数のスライスを使用できるようにするためです。例えば:

x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]

これら 3 つのスライスはすべて、基になる同じ配列内の重複するデータを指しています。

于 2012-09-05T03:44:55.743 に答える
1

Go は常に値渡しです。ポインター、マップ、チャネルなど、特定の型は参照型です。または、スライスのような部分参照型 (基になる配列への参照と、長さと容量の値で構成されます)。ただし、型に関係なく、すべてが値渡しされます。したがって、ローカル変数への割り当ては、外部に影響を与えることはありません。

于 2012-09-05T19:26:39.367 に答える