54

arrayおよびsliceデータ型と混同していることに気づきました。

Go docs から、配列は次のように説明されています。

Go と C で配列が機能する方法には大きな違いがあります。Go では、

  • 配列は値です。ある配列を別の配列に代入すると、すべての要素がコピーされます。
  • 特に、配列を関数に渡すと、配列へのポインターではなく、配列のコピーを受け取ります。
  • 配列のサイズは、その型の一部です。[10]int 型と [20]int 型は異なります。

機能:

C ファミリーのすべての言語と同様に、Go のすべては値渡しです。つまり、関数は常に、値をパラメーターに代入する代入ステートメントがあるかのように、渡されるもののコピーを取得します。たとえば、関数に int 値を渡すと int のコピーが作成され、ポインター値を渡すとポインターのコピーが作成されますが、ポインターが指すデータは作成されません。

sort.Ints(arrayValue)スライスではなく配列として宣言したときに、渡された変数を変更するのはなぜですか?

コード

var av = []int{1,5,2,3,7}

fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
return

出力

[1 5 2 3 7]
[1 2 3 5 7]
4

5 に答える 5

53

スライス: 使用法と内部構造」を参照してください。

var av = []int{1,5,2,3,7}

これは配列ではなくスライスです。

スライス リテラルは、配列リテラルと同じように宣言されますが、要素数が省略されます。

これは、並べ替え関数がスライスによって参照される内容を変更する理由を説明しています。

以下でKirkがコメントしたようsort.Ints に、スライスではなく配列を渡した場合、エラーが発生します。

func Ints(a []int)
于 2012-07-31T09:39:17.087 に答える
52

配列ではなくスライスを使用しているためです。

それはスライスです:

var av = []int{1,5,2,3,7}

そして、それらは配列です:

var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}

コンパイルしようとすると:

var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)

、次のエラーが表示されます。

関数の引数で []int 型として av ([5]int 型) を使用することはできません

sort.Ints はスライス []intを受け取ることを期待しているため。

于 2012-07-31T09:38:47.953 に答える
11

[]int{1,5,2,3,7}配列ではありません。配列は、 のように、その型に長さがあり[5]int{1,5,2,3,7}ます。

スライスのコピーを作成し、代わりに並べ替えます。

a := []int{1,5,2,3,7}
sortedA := make([]int, len(a))
copy(sortedA, a)
sort.Ints(sortedA)
fmt.Println(a)
fmt.Println(sortedA)
于 2012-07-31T09:47:25.787 に答える