golang スライスの使用方法の詳細な紹介

PHPz
リリース: 2023-04-05 10:48:58
オリジナル
1325 人が閲覧しました

[はじめに]

Go 言語は C ファミリーのプログラミング言語で、効率性、単純さ、安全性などの特徴を持ち、現代のプログラミング言語のいくつかの特徴も備えています。 Go 言語では、スライスは非常に重要なデータ型であり、多くの状況で広く使用されています。この記事では、誰もが golang でのスライスの使用法をよりよく理解できるように、golang でのスライスの使用法を詳しく紹介します。

[1. スライシングの基本定義]

まず、golang におけるスライシングの基本的な定義を見てみましょう。 Go 言語では、スライスは、配列の要素へのポインター、長さ、容量の 3 つのフィールドを含む構造体です。スライスを作成するときは、次の形式の組み込みの make() 関数を使用する必要があります:

func make([]T, len, cap) []T
ログイン後にコピー

このうち、T はスライスの要素タイプを表し、len はスライスの長さを表します。 、cap はスライスの容量を表します。 make() 関数を使用する場合、容量が指定されていない場合、容量は長さと同じになります。

具体的には、次のコードを通じてスライスを作成できます:

a := make([]int, 5) //创建一个长度为5的int类型切片
b := make([]int, 3, 5) //创建一个长度为3,容量为5的int类型切片
ログイン後にコピー

ご覧のとおり、make() 関数は新しいスライスを返し、これを変数に割り当てることができます。 。

[2. スライスの基本操作]

スライスを定義した後、スライスに対していくつかの基本操作を実行できます。以下では、golang におけるスライスの一般的な操作を詳しく紹介します。

[2.1 スライスのアクセスとトラバーサル]

まず、インデックスを作成することでスライス内の要素にアクセスできます。配列と同様、golang のスライス インデックスも 0 から始まります。例:

a := []int{1, 2, 3}
fmt.Println(a[0]) //输出1
fmt.Println(a[1]) //输出2
fmt.Println(a[2]) //输出3
ログイン後にコピー

同時に、for ループを使用してスライス内のすべての要素を走査することもできます。例:

a := []int{1, 2, 3}
for i:=0;i<len(a);i++ {
    fmt.Println(a[i])
}
ログイン後にコピー

さらに、golang には、スライス内のすべての要素を走査するために使用できる range キーワードも用意されています。例:

a := []int{1, 2, 3}
for i, v := range a {
    fmt.Println(i, v)
}
ログイン後にコピー

上記のコードでは、i は要素のインデックスを表し、v は要素の値を表します。

[2.2 スライスの追加操作]

golang では、append() 関数を使用して新しい要素をスライスに追加できます。この関数の形式は次のとおりです。

func append(s []T, vs ...T) []T
ログイン後にコピー

ここで、s は追加されるスライスを表し、vs は追加される要素を表します。 append() 関数では、1 つ以上のパラメータを渡してスライスの最後に追加できます。例:

a := []int{1, 2, 3}
a = append(a, 4, 5, 6)
fmt.Println(a) //输出[1 2 3 4 5 6]
ログイン後にコピー

append() 関数を使用すると、新しいスライスが作成されることに注意してください。新しいスライスを変数に割り当てる必要がある場合は、変数を再割り当てする必要があります。そうしないと、元のスライスは変更されません。

[2.3 スライスのコピー操作]

golang では、copy() 関数を使用してスライスをコピーできます。この関数の形式は次のとおりです。

func copy(dst, src []T) int
ログイン後にコピー

ここで、dst はターゲット スライスを表し、src はソース スライスを表します。 copy() 関数を呼び出すときに、ターゲット スライスの長さがソース スライスよりも小さい場合、ターゲット スライスの長さの要素のみがコピーされます。例:

a := []int{1, 2, 3}
b := make([]int, 2)
copy(b, a)
fmt.Println(b) //输出[1 2]
ログイン後にコピー

copy() 関数を使用すると、新しいスライスも作成されることに注意してください。

[3. スライスの拡張]

スライスに要素を追加するときに、スライスに十分なスペースがなくなった場合、golang は自動的にスライスを拡張します。拡張する場合、golang はスライスの容量を 2 倍にし、新しい基礎となる配列を作成します。同時に、golang は元のスライスの要素を新しい基になる配列にコピーします。

拡張中に、新しい基になる配列の長さが長すぎる場合、golang は現在のスライス内の要素の数に基づいて新しい基になる配列の長さを選択することに注意してください。具体的には、golang は次のルールに基づいて選択を行います。

  • スライス内の要素の数が 1024 未満の場合、新しい基になる配列の長さは元の長さの 2 倍に等しくなります。
  • If スライス内の要素の数が 1024 以上の場合、新しい基になる配列の長さは元の配列の 1.25 倍になります。

golang でのスライスの展開メカニズムを理解すると、スライスをより有効に活用してプログラムの効率を向上させることができます。

[4. スライスのメモリ管理]

スライスを使用する場合、メモリ管理の問題に注意する必要があります。 golang では、基になるスライスは配列に対応し、スライスが別の変数に代入されると、その基になる配列もコピーされます。例:

a := []int{1, 2, 3}
b := a //将a赋值给b
b[0] = 4 //改变b中的第一个元素
fmt.Println(a) //输出[1 2 3]
fmt.Println(b) //输出[4 2 3]
ログイン後にコピー

スライスがパラメータとして関数に渡される場合、スライスの基礎となる層は配列に対応するため、関数内のスライスの要素を変更すると、元のスライスに影響を与えます。例:

func changeSlice(a []int) {
    a[0] = 4 //修改a中的第一个元素
}

b := []int{1, 2, 3}
changeSlice(b)
fmt.Println(b) //输出[4 2 3]
ログイン後にコピー

スライスと基になる配列のメモリ管理の問題を理解すると、スライスをより適切に使用し、プログラムの効率を向上させ、基になる配列への予期せぬ影響を回避できるようになります。

[結論]

スライスは golang において非常に重要なデータ型であり、多くの場面で広く使用されています。この記事では、golangにおけるスライスの基本的な定義、操作、拡張、メモリ管理について詳しく紹介します。この記事が、golang でのスライスの使用法をさらに理解し、スライスをより適切に使用して効率的なプログラムを開発するのに役立つことを願っています。

以上がgolang スライスの使用方法の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート