Sliceとappend関数を解説

created byTakuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.

こんにちはnasustです。 Sliceとappend関数による配列の操作について解説します。

Sliceのアクセス方法

以下の書式は配列またはスライスから部分的に抜き出し新しいスライスを作成します。

a[ low : high ]
go

lowからhigh - lowの長さのスライスを抜き出します。

例:

a := []int{1,2,3,4,5}
s := [1:4] //s [2,3,4]
go

また省略することも可能です。

a[2:] //[3,4,5]      a[2:len(a)]と同じ
a[:3] //[1,2,3]      a[0:3]と同じ
a[:]  //[1,2,3,4,5]  a[0:len(a)]と同じ
go

append関数の解説

append関数はスライスに要素を追加できます。 append関数に与えられる引数には幾つかパターンがあります。その引数について紹介します。

s0 := []int{1,2}
s1 := append(s0,3) //要素を一つ追加 [1,2,3]
s2 := append(s1,4,5,6) //要素を複数追加 [1,2,3,4,5,6]
s3 := append(s2 , []int{7,8,9} ) //スライスを追加 [1,2,3,4,5,6,7,8,9]
go

appendでコレクション操作を実現する方法

スクリプトでは配列に様々な操作を用意してあります。例えば、途中に挿入するinsertや、追加するPushなどあります。しかしGo言語ではappend関数しかありません。ですがappend関数工夫することで実現することが出来ます。

指定したインデックスの要素を削除

func DeleteAt( s []int , i int) s[]int {
	return append( s[:i], s[i+1:]... )
}
go

指定したインデックスに要素を挿入

func Insert( s []int, i int, value int) s[]int {
	if i == 0 {
		return append([]int{value}, s...)
	} else {
		return append(s[:i], append([]int{value}, s[i+1:]...)...)
	}
}
go

先頭に要素を追加した時のパフォーマンスについては以下の記事が参考になります。

指定したインデックスにスライスを挿入

func InsertArray(s []int, i int, value []int) s[]int {
	if i == 0 {
		return append(value.Slice, s...)
	} else {
		return append(s[:i], append(value, s[i+1:]...)...)
	}
}
go

Join

import (
	"fmt"
	"strings"
)

func Join(s []int sep string) string {
	buff := make([]string, len(s))
	for i, v := range s {
		buff[i] = fmt.Sprint(v)
	}
	return strings.Join(buff, sep)
}
go

Push

func Push(s []int, value int) s[]int {
	return append(s, value)
}
go

参考資料

Goプログラミング言語仕様 - golang.jp

prevnext