Skip to Content

入門Goプログラミング Lesson17(スライス)から学んだこと

スライス

スライスの宣言

1
2
3
var hoge []string
var hoge = []string("a", "b")
hoge := []string{"a", "b"}

よく使う初期化方法

長さを省略すると、stringなら で、intなら0が入った状態のスライスになる
真っさらならスライスが欲しい時は容量だけ指定している

1
hoge := make([]string, 0, 10) // 型, 長さ, 容量

配列をスライスする

スライスを代入した変数(man, woman)は、配列(seiken3)を見るためのビュー
スライス(man)の要素に新しい値(狼)を代入すると、スライスの根底にある基底配列が更新される
つまり、参照しているものは同じなのでmanに代入した値がsekein3にも反映される!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import "fmt"

func main() {
	seiken3 := [...]string{ // ...にすると要素数はコンパイラが数えてくれる
		"デュラン",
		"ケヴィン",
		"ホークアイ",
		"アンジュラ",
		"シャルロット",
		"リース", // 最後にもカンマが必要
	}

	man := seiken3[0:3]
	woman := seiken3[3:6]
	fmt.Println("man", man)
	fmt.Println("woman", woman)

	// manのケヴィンを狼で上書き
	man[1] = "狼"
	fmt.Println("---  manのケヴィン書き換え後 ---")
	fmt.Println("man", man)
	fmt.Println("seiken3", seiken3)
}
man [デュラン ケヴィン ホークアイ]
woman [アンジュラ シャルロット リース]
---  manのケヴィン書き換え後 ---
man [デュラン 狼 ホークアイ]
seiken3 [デュラン 狼 ホークアイ アンジュラ シャルロット リース]

インデックスの省略

インデックスには負の値を設定できない

1
2
3
4
5
6
	man := seiken3[:3]   // 先頭の0を省略
	woman := seiken3[3:] // 末尾の6を省略
	all := seiken3[:]    // seiken3 と同じ結果
	fmt.Println("man", man)
	fmt.Println("woman", woman)
	fmt.Println("all", all)
man [デュラン ケヴィン ホークアイ]
woman [アンジュラ シャルロット リース]
all [デュラン ケヴィン ホークアイ アンジュラ シャルロット リース]

関数でスライスを利用

同じ基底配列を参照するため、playersを変更するとseiken3の無駄な空白が取り除かれる
spaceCut関数で空白を削除している

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
	"fmt"
	"strings"
)

func main() {
	seiken3 := []string{ // []の間に...をいれると配列、入れないとスライス
		"デュラン ",
		"ケヴィン ",
		"ホークアイ ",
		" アンジュラ",
		"       シャルロット",
		"リース    ", // 最後にもカンマが必要
	}
	spaceCut(seiken3)
	fmt.Println(strings.Join(seiken3, ""))
}

func spaceCut(players []string) {
	for i := range players {
		players[i] = strings.TrimSpace(players[i])
	}
}
デュランケヴィンホークアイアンジュラシャルロットリース

スライスのための複合リテラル

基底配列の全要素を表すスライスが必要なら、配列を宣言してからスライスにする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

import (
	"fmt"
)

func main() {
	locationArray := [...]string{"Abashiri", "Tokoro", "Kitami"}
	locationSlice := locationArray[:]

	fmt.Printf("locationArray: %T\n", locationArray)
	fmt.Printf("locationSlice: %T\n", locationSlice)

}
locationArray: [3]string
locationSlice: []string

スライスを直接宣言する

1
locationSlice := []string{"Abashiri", "Tokoro", "Kitami"}

スライスとメソッド

基底のスライスまたは配列を使って型を定義することができる
型をメソッドに結び付けることができる

まとめ

  • 代入または関数に渡されたスライスは、基底配列を共有する
  • スライスの初期化には複合リテラルを使うと便利

感想

配列よりスライスを使った方が使い勝手は良さそう
スライスをメソッドに紐付けるのはどう使っていいか理解できなかった

参考

https://note.mu/shimakaze_soft/n/n83799f0dfdb7