web-dev-qa-db-ja.com

配列とスライスのデータ型

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]
48
duganets

Slices:usage and internals 」を参照してください

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

それはスライスであり、配列ではありません。

スライスリテラルは、要素カウントを省略する以外は、配列リテラルと同様に宣言されます。

これが、ソート関数がスライスによって参照される内容のcontentを変更する理由を説明しています。

Kirksort.Ints は、スライスではなく配列を渡した場合にエラーを返します。

func Ints(a []int)
41
VonC

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

それはスライスです:

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 を受け取ることを期待しています。

44
Artem Shitov

[]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)
11
Moshe Revah
var av = []int{1,5,2,3,7}

上記のステートメントでは、配列のようにスライスを初期化しています

配列を作成するには、構文は次のようになります

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

スライスは配列へのポインタです。配列を別の配列にコピーするとき、または関数で配列を渡すとき、配列のコピー全体がコピーまたは渡されます。これは、配列サイズが大きい場合、よりコストのかかる操作になります。スライスに行くことができます。

1
swarna