スライスの宣言方法と値の取り出し

Go言語
この記事は約9分で読めます。
Go初学者
Go初学者

Go言語の配列に似たスライスというのがあるらしいけど…どうやって使うのかな?

この記事ではGo言語のスライスの基本が理解できます!
  • スライスの宣言方法を2種類
  • スライスから値を取り出す方法(初心者さんの混乱ポイント!)

Go言語では配列は要素を後から追加することができませんが、スライスを使うことで要素の追加もできるようになります。

それ以外にも配列とスライスには見た目は似ていますが、機能的な違いが複数あります。

今回はスライスの宣言方法と値の取り出し方に特化してお伝えしていきます。

特に、スライスや配列から値を取り出す方法は初心者さんの混乱ポイントでもあるので、ここはゆっくりと学習していきましょう。

スライスについては、記事を分けてじっくりとご紹介いたします。

配列については、当ブログ記事を参考にしてください。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Go言語でのスライスの宣言は2種類あります

Go言語でのスライスの宣言は、変数や配列の宣言と同様に基本的な宣言方法と省略した形での宣言方法の2種類あります。

それでは、それぞれ確認していきましょう。

基本的なスライスの宣言

var スライス名 []型

スライスは上記のような形で宣言できます。

配列との違いは、 [] に要素数を記入しないことです。

スライスを宣言した時に初期化する記述方法は以下の通りです。

var スライス名 []型 = []型{値1, 値2, …}

それでは、プログラムで確認していきましょう。

// スライスの基本的な宣言
package main

import "fmt"

func main() {
    // int型のスライスを宣言
    // 配列と違い[]に要素数を記述しない
    var num []int
    fmt.Println(num)

    // スライスを宣言した時に初期化する
    var num2 []int = []int{100, 200, 300}
    fmt.Println(num2)
}
// 出力結果
$ go run main.go 
[]  // 空の配列が出力される
[100 200 300]  // 初期化した値が出力される

スライスの値を変更する

スライスも配列と同じく要素の値を変更することができます。

// スライスの値を変更する
package main

import "fmt"

func main() {
    var num []int
    fmt.Println(num)

    var num2 []int = []int{100, 200, 300}
    fmt.Println(num2)

    // 値を変更する
    num2[0] = 1000
    fmt.Println(num2)
}
// 出力結果
$ go run main.go 
[]  // 空の配列が出力される
[100 200 300]  // 初期化した値が出力される
[1000 200 300]  // インデックス番号0番目が変更

ちなみに、スライスへの値の追加は append() 関数を使用して行います。

スライスを省略形で宣言

スライス名 := []型{値1, 値2, …}

それでは、プログラムで確認していきましょう。

// スライスを省略形で宣言
package main

import "fmt"

func main() {
    str := []string{"Golang", "PHP", "HTML"}
    fmt.Println(str)
}
// 出力結果
$ go run main.go 
[Golang PHP HTML]
もりぴ
もりぴ

スライスの宣言の時に初期化まで行うのであれば、省略形で宣言していいと思います。

【参考】多次元スライスの宣言方法

スライスではリストの中にリストを宣言することができます。

プログラムで実際に確認しましょう。

// 多次元スライスの宣言方法
package main

import "fmt"

func main() {
    // 多次元スライス
    var mult = [][]int{
	{1, 2, 3},
	{4, 5, 6},
	{7, 8, 9},
    }
    fmt.Println(mult)
}
// 出力結果
$ go run main.go 
[[1 2 3] [4 5 6] [7 8 9]]
もりぴ
もりぴ

多次元のスライス宣言もできるということを、いまは理解できていればOKです。

スライスから値を取り出す

スライスから値を取り出す方法についてお伝えします。

値の取り出しは、スライスからひとつずつ取り出したり、全ての値を取り出すのは特に問題ないのですが連続した値を取り出す際に注意が必要です。

まずは、それぞれプログラムを見ながら確認していきましょう。

スライスから値をひとつずつ取り出す

スライスから値をひとつずつ取り出すには、スライス名[インデックス番号] で取り出すことができます。

ちなみにインデックス番号は 0 からスタートします。

// スライスから値をひとつずつ取り出す
package main

import "fmt"

func main() {
    // 値の取り出し
    var num5 []int = []int{1, 2, 3, 4, 5}

    // 最初の値を取り出す(インデクス番号0)
    fmt.Println(num5[0])

    // 2番目の値を取り出す(インデクス番号1)
    fmt.Println(num5[1])

    // 3番目の値を取り出す(インデクス番号2)
    fmt.Println(num5[2])

    // 4番目の値を取り出す(インデクス番号3)
    fmt.Println(num5[3])

    // 5番目の値を取り出す(インデクス番号4)
    fmt.Println(num5[4])
}
// 出力結果
$ go run main.go 
1
2
3
4
5

ちなみに、スライスでは len() 関数(要素数を出力する関数)も使用できます。

len() 関数を使用して最後の値を取り出す方法をプログラムで確認しましょう。

// len() 関数を使用して最後の値を取り出す
package main

import "fmt"

func main() {
    var num5 []int = []int{1, 2, 3, 4, 5}

    // 5番目の値を取り出す(インデクス番号4)
    fmt.Println(num5[4])

    // 要素数が定かでない時は、こちら…
    fmt.Println(num5[len(num5)-1])
}
// 出力結果
$ go run main.go 
5
5

len(num5) で出力される値は要素数の 5 になります。

インデックス番号にするためには、 len(num5)-1 として 1 引く必要があります。

要素数がわからない時に len() 関数を使用しましょう。

スライスの全ての値を取り出す

スライスの値を全て取り出すには、スライス名をそのまま記述するだけで出力されます。

// スライスの全ての値を取り出す
package main

import "fmt"

func main() {
    var num5 []int = []int{1, 2, 3, 4, 5}

    // スライスの全ての値を取り出す
    fmt.Println(num5)
}
// 出力結果
$ go run main.go 
[1 2 3 4 5]

スライスから連続する値を出力する

スライスから連続した値を出力するには スライス名[インデックス番号:インデックス番号+1] で出力されます。

: を使用するのがポイントとなります。

もりぴ
もりぴ

私は、この : の後のインデックス番号に 1 足すことに混乱しました。

では、スライスの2番目から4番目の値を出力するプログラムを確認してみましょう。

// スライスの2番目から4番目の値を出力する
package main

import "fmt"

func main() {
    var num5 []int = []int{1, 2, 3, 4, 5}

    fmt.Println(num5[1:4])
}
// 出力結果
$ go run main.go 
[2 3 4]  // スライスの2番目から4番目の値を出力

通常の考えであれば、 : の前後はインデックス番号で指定したくなりますが、: の後ろは +1 するところを間違わないようにしましょう。

そして、連続した値を出力する時に、最初から○番目までや○番目から最後までの時は数字を省略できます。

package main

import "fmt"

func main() {
    var num5 []int = []int{1, 2, 3, 4, 5}

    // インデックス番号0と1の値を取り出す
    // 最初のインデックス番号0を省略できる
    fmt.Println(num5[:2])

    // インデックス番号2から最後まで
    // 最後のインデックス番号+1を省略できる
    fmt.Println(num5[2:])
}
// 出力結果
$ go run main.go 
[1 2]
[3 4 5]
もりぴ
もりぴ

スライスから連続する値を出力する方法に関しては実際にコードを書き、いろんなパターン試してみましょう。

【まとめ】Go言語でのスライス宣言と値の取り出し

今回は、Go言語でのスライス宣言と値の取り出しについてお伝えしてきました。

それではまとめに入りましょう。

Go言語のスライス宣言と値の取り出しで押さえておくこと!
  • 基本的なスライスの宣言方法
    var スライス名 []型
  • 基本的なスライス宣言で初期化する
    var スライス名 []型 = []型{値1, 値2, …}
  • スライスを省略形で宣言する
    スライス名 := []型{値1, 値2, …}
  • スライスから値をひとつずつ取り出すには、
    スライス名[インデックス番号] で取り出す
  • スライスの全ての値を取り出すには、
    スライス名 で取り出す
  • スライスから連続する値を出力するには、
    スライス名[インデックス番号:インデックス番号+1] で取り出す
  • スライスから連続する値を出力する際に、最初から○番目までや○番目から最後までの時は数字を省略できる

今回は、スライスの宣言方法とスライスからの値の取り出しを理解しておきましょう。

スライスに関しては、まだまだお伝えしなければいけないことがあります。

当ブログでも、順を追って説明していきますので、焦らずゆっくり学習を進めていきましょう。

comment

タイトルとURLをコピーしました