スライス
スライスの宣言
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