array
およびslice
データ型と混同されていることに気付きました。
Goのドキュメントから、配列は次のように説明されています。
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]
「 Slices:usage and internals 」を参照してください
var av = []int{1,5,2,3,7}
それはスライスであり、配列ではありません。
スライスリテラルは、要素カウントを省略する以外は、配列リテラルと同様に宣言されます。
これが、ソート関数がスライスによって参照される内容のcontentを変更する理由を説明しています。
Kirk 、 sort.Ints
は、スライスではなく配列を渡した場合にエラーを返します。
func Ints(a []int)
配列ではなくスライスを使用しているためです。
それはスライスです:
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)を使用できません
as sort.Intsは slice [] int を受け取ることを期待しています。
[]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)
var av = []int{1,5,2,3,7}
上記のステートメントでは、配列のようにスライスを初期化しています
配列を作成するには、構文は次のようになります
var av = [5]int{1,5,2,3,7}
スライスは配列へのポインタです。配列を別の配列にコピーするとき、または関数で配列を渡すとき、配列のコピー全体がコピーまたは渡されます。これは、配列サイズが大きい場合、よりコストのかかる操作になります。スライスに行くことができます。