Go言語入門 / golang 入門 Sliceとappend関数を解説

f:id:nasust:20161122141513p:plain The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) CC3.0

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

Sliceのアクセス方法

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

a[ low : high ]

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

例:

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

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

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)]と同じ

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]

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

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

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

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

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

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言語】append使い分けのススメ 〜スライスの先頭へ要素を追加するとき、中身の型は固定長?可変長?〜 | eureka tech blog

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

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:]...)...)
    }
}

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)
}

Push

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

参考資料

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


Go言語 / golang 入門 目次に戻る

広告を非表示にする