post Image
go言語のslice操作をまとめてみた(shiftしたりpushしたり)

slice(配列)操作

sliceの動作はそこそこ分かりやすいけれども、操作は煩雑。
自分が使ってる方法をよく忘れるのでとりあえずまとめてみました。
best practiceを求めたわけでは無いですが、一時変数など、余計なメモリ確保をしないようにはしてみました。
パフォーマンス検証とかはそのうちやります。

sliceの末尾に要素を追加する

push動作です。ふつうにappendしているだけです。

slice = append(slice, 追加要素)

サンプル GoPlayground

sliceの末尾を取り出す

pop動作です。末尾を取り出してから、末尾を除いた範囲を切り出しています。
参照のみの変更なので、ポインタは変わりません。

// 要素の取り出しはポインタでなく値参照してください。
// (*をつける、copyするなど)
// 他のポインタ変数が残っていると書き換えられる可能性があるので…
末尾の要素 := slice[len(slice)-1] 
slice = slice[:len(slice)-1] // 末尾削除

サンプル GoPlayground

sliceの先頭に要素を追加する

unshift動作です。スライスの要素を右にシフトして先頭要素を置き換えています。
自身のappendなのでcapacityに余裕があればポインタは変わりません。

slice, slice[0] = append(slice[0:1], slice[0:]...), 追加要素

サンプル GoPlayground

sliceの先頭から要素を取り出す

shift動作です。先頭の要素を取り出してから、2番目以降の要素を切り出します。
ポインタの先頭は変わりますが、各要素のポインタは変わりません。

// 要素の取り出しはポインタでなく値参照してください。
// (*をつける、copyするなど)
// 他のポインタ変数が残っていると書き換えられる可能性があるので…
先頭の要素 := slice[0]
slice = slice[1:]

サンプル GoPlayground

任意の場所に要素を追加する

特殊な場合だとは思いますが…
先頭に追加する場合の応用です。追加する位置より後ろを右側にシフトして、空いた場所に値を入れています。
もちろんポインタは変わりません。

pos := 追加する位置
// NGコード 代入順序が保証されないからダメでした
// slice , slice[pos] = append(slice[:pos+1], slice[pos:]...), 追加する要素
slice = append(slice[:pos+1], slice[pos:]...)
slice[pos] = 追加する要素

サンプル GoPlayground

よりスマートな方法ご存じであればぜひ教えて下さいm(_ _)m


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。