次の記事を読みながらスライスの操作を練習してました。
その中で
a[:0:0]って何?初めて見たぞ
今回は a[:0:0] について学んだことについて書きたいと思います。
目次
a[:0:0] は何なのか?
僕が知ってること
知らないことを調べる前に、まずは僕がGoのスライスについて知っていることをまとめます。
a := []byte("Hello, world!")
fmt.Println(string(a[:5])) // Hello
fmt.Println(string(a[5:])) // , world!
fmt.Println(string(a[3:7])) // lo,
fmt.Println(string(a[:])) // Hello, world!
スライスについてはこれくらいしか知りません。
a[:0]ならわかりますが、a[:0:0]って、何で :0 が2つも続いてるの???何これ?状態です。
改めて a[:0:0]って何?
実際に試してみると訳がわからないです。
a := []byte("Hello, world!")
b := []byte("Hello, world!")
a = a[:0:0]
b = b[:0]
fmt.Printf("a[:0:0] => %v\n", a) // a[:0:0] => []
fmt.Printf("b[:0] => %v\n", b) // b[:0] => []
a[:0:0] と b[:0] が同じ結果です。
a[:0:0]って必要あるのか?
でもわざわざ使ってるってことはなんか違いがあるはず・・・
で、あれこれ調べるとChatGPTが教えてくれました。
a[:0:0]って何ですか?
スライスは a[開始インデックス:終了インデックス:容量(オプション)]で表現されます。
a[:0:0]は開始インデックスが省略され、終了インデックスと容量がゼロとなっています。
容量なんてオプション知らなかった
a[:0:0]は開始インデックスが省略されて、要素と容量がゼロの空のスライスを作成していたんですね。
実際に確認
a := []byte("Hello, world!")
b := []byte("Hello, world!")
a = a[:0:0]
b = b[:0]
fmt.Printf("a[:0:0]=%v, len=%d, cap=%d\n", a, len(a), cap(a))
fmt.Printf("b[:0] =%v, len=%d, cap=%d\n", b, len(b), cap(b))
// a[:0:0]=[], len=0, cap=0
// b[:0] =[], len=0, cap=13
確かに a[:0:0] は容量もゼロになってますね。
まとめ
- Goのスライスは a[開始インデックス:終了インデックス:容量(オプション)]で表される
- a[:0:0]は、aの要素と容量がゼロの空のスライスが作成される
コメント