1. ホーム
  2. go

[解決済み] スライス内の要素を削除する

2022-05-09 09:07:14

質問内容

func main() {
    a := []string{"Hello1", "Hello2", "Hello3"}
    fmt.Println(a)
    // [Hello1 Hello2 Hello3]
    a = append(a[:0], a[1:]...)
    fmt.Println(a)
    // [Hello2 Hello3]
}

このappend機能によるdeleteの仕掛けはどうなっているのでしょうか?

最初の要素(空の配列)より前のすべてをつかんでいるように見えますが

そして、最初の要素(位置ゼロ)以降のすべてを追加します。

は何をするのか?(ドット・ドット・ドット)は何をするのですか?

どのように解決するのですか?

どこ a はスライス、そして i は削除したい要素のインデックスです。

a = append(a[:i], a[i+1:]...)

... はGoの変量引数のためのシンタックスです。

基本的に 定義 関数は、あなたが渡したすべての引数を、その型のひとつのスライスに入れます。そうすることで、好きなだけ引数を渡すことができる(例えば。 fmt.Println は好きなだけ引数を取ることができます)。

では 呼び出し という関数があります。 ... はその逆で、スライスを展開し、それらを別々の引数として可変個体関数に渡します。

では、この行は何をするかというと

a = append(a[:0], a[1:]...)

は基本的に

a = append(a[:0], a[1], a[2])

さて、不思議に思うかもしれませんが、どうして

a = append(a[1:]...)

さて、関数定義の append

func append(slice []Type, elems ...Type) []Type

つまり、最初の引数は正しい型のスライスでなければならず、2番目の引数はバリアディックなので、空のスライスを渡し、残りのスライスを解凍して引数を埋めるのです。