ホームページ  >  記事  >  バックエンド開発  >  golangスライスの修正操作について議論する

golangスライスの修正操作について議論する

PHPz
PHPzオリジナル
2023-04-11 09:13:37679ブラウズ

Go 言語のスライスは、連続データ ブロックを簡単に処理できる強力なデータ構造です。配列と比較すると、スライスは可変長で要素を追加または削除できるため、Go で頻繁に使用されるデータ構造の 1 つとなります。

ただし、スライスを使用する場合、必然的にスライス内の一部の要素を変更する必要があるため、この記事ではスライスの変更操作について説明します。

  1. スライス内の指定した位置にある要素を変更する方法

スライス内の要素を変更するには、インデックスを使用してスライス内の要素にアクセスします。配列のように。たとえば、次のコードは、スライス内の指定された位置にある要素を変更する方法を示しています。

package main

import "fmt"

func main() {
    nums := []int{1, 2, 3, 4}
    fmt.Println(nums)   // 输出 [1 2 3 4]

    nums[1] = 5
    fmt.Println(nums)   // 输出 [1 5 3 4]
}

上記のコードでは、最初に 4 つの整数を含むスライスを初期化し、次に 2 番目の要素の値を変更します。 5まで。最後に、変更したスライスを出力します。ご覧のとおり、変更は成功しました。

  1. スライスに要素を追加する方法

組み込み関数 append() を使用して、要素をスライスに追加できます。スライスを変更する最も簡単な方法は、append() 関数を使用することです。 append() 関数は、JavaScript の Array.push() と同様に使用されます。次のコードは、要素をスライスに追加する方法を示しています。

package main

import "fmt"

func main() {
    nums := []int{1, 2, 3, 4}
    fmt.Println(nums)   // 输出 [1 2 3 4]

    nums = append(nums, 5)
    fmt.Println(nums)   // 输出 [1 2 3 4 5]
}

上記のコードでは、まず 4 つの整数を含むスライスを初期化し、次に append() 関数を使用してスライスの末尾に 5 を追加します。 。最後に、追加したスライスを出力します。ご覧のとおり、追加は成功しました。

スライス内の要素の数がその容量に達した場合、要素を追加するときに基になる配列がスペースを再割り当てする可能性があり、パフォーマンスの低下を引き起こす可能性があることに注意してください。したがって、要素を追加するときにスペースの不必要な再割り当てを避けるために、最初に組み込み関数 cap() を使用して、拡張が必要かどうかを判断する必要があります。

if len(nums)+1 > cap(nums) {
     newNums := make([]int, len(nums), cap(nums)*2)
     copy(newNums, nums)
     nums = newNums
}

このコード スニペットは、十分な容量があるかどうかを確認します。新しい要素を追加するスライス。そうでない場合は、2 倍の容量を持つ新しいスライスを作成し、copy() 関数を使用して古いスライスから新しいスライスにすべての要素をコピーします。最後に、新しいスライスを元のスライスに割り当てます。このアプローチは、元のスライスの再割り当てを回避し、代わりに基礎となる配列の容量を拡張するため、より効率的です。

  1. スライスから要素を削除する方法

要素の追加と同様に、組み込み関数 append() を使用してスライスから要素を削除できます。 Go には組み込みの削除関数がないため、スライス内の要素を削除するには append() 関数を使用する必要があります。次のコードは、スライスから要素を削除する方法を示しています。

package main

import "fmt"

func main() {
    nums := []int{1, 2, 3, 4}
    fmt.Println(nums)   // 输出 [1 2 3 4]

    nums = append(nums[:1], nums[2:]...)
    fmt.Println(nums)   // 输出 [1 3 4]
}

上記のコードでは、最初に 4 つの整数を含むスライスを初期化し、次に append() 関数を使用して 2 番目の要素を削除します。具体的には、最初の要素から 2 番目の要素 (排他的) までのサブスライスと、3 番目の要素から最後の要素までのサブスライスを接続することで、新しいスライスを取得し、それをオリジナル スライスに割り当てます。

Go のスライスは構造体であるため、基になる配列へのポインタ、スラ​​イスの長さと容量の情報が含まれるため、スライス内の要素を削除するときは、スライスを再作成する必要があることに注意してください。新しいスライスを作成し、元のスライスから新しいスライスに要素をコピーします。

  1. スライス内の複数の要素を変更する方法

スライス内の複数の要素を変更する場合は、for ループを使用してスライスを走査して変更できます。各反復での現在の要素。次のコードは、スライス内の複数の要素を変更する方法を示しています。

package main

import "fmt"

func main() {
    nums := []int{1, 2, 3, 4}
    fmt.Println(nums)   // 输出 [1 2 3 4]

    for i := 0; i < len(nums); i++ {
        nums[i] *= 2
    }
    fmt.Println(nums)   // 输出 [2 4 6 8]
}

上記のコードでは、最初に 4 つの整数を含むスライスを初期化し、次に for ループを使用してスライスを走査し、現在の要素を 2 で乗算します。 。

スライス内の複数の要素を変更する場合、各反復中に現在の要素を再計算してスライスにコピーする必要があることに注意してください。これは非効率であるだけでなく、エラーも発生しやすくなります。

まとめ

以上はGoにおけるスライスの変更操作の紹介です。スライス内の個々の要素を変更するには、インデックスを使用して、配列と同様にスライス内の要素にアクセスします。要素をスライスに追加するには、組み込み関数 append() を使用できます。スライスから要素を削除するには、append() 関数を使用し、2 つのサブスライスを連結することで指定された要素を削除します。最後に、スライス内の複数の要素を変更する場合は、for ループを使用してスライス全体をループし、反復ごとに現在の要素を変更します。

以上がgolangスライスの修正操作について議論するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。