MENU

スライスの a[:0:0]って何?

次の記事を読みながらスライスの操作を練習してました。

その中で

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]って何ですか?

ChatGPT

スライスは 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の要素と容量がゼロの空のスライスが作成される
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

CAPTCHA

目次