スライス(slice)とマップ(map)の簡単な説明
- スライス(slice)が他の言語でいうところの「配列」みたいなもの
- マップ(map)が他の言語でいうところの「連想配列」みたいなもの
スライスの定義
- var 変数名 []型
- 変数名 := []型{}
package main
import "fmt"
type User struct {
ID int
Name string
}
func main() {
// 定義その1&要素追加
var sample []User
sample = append(sample, User{
ID: 1,
Name: "test",
})
// 定義その2
sample2 := []User{}
fmt.Print(sample)
fmt.Print(sample2)
}
マップの定義
- var 変数名 map[型]型
- 変数名 := map[型]型{}
package main
import "fmt"
func main() {
// 定義その1&要素追加
var sample map[string]interface{}
sample = map[string]interface{}{}
sample["ID"] = 1
sample["Name"] = "test"
// 定義その2
sample2 := map[string]interface{}{}
fmt.Print(sample)
fmt.Print(sample2)
}
スライスの追加・削除
Go言語では配列は固定長、スライスは可変長とのこと。
他の言語で使うような配列は Go言語でいうところのスライスにあたる。
要素を追加&削除する
- 要素を追加するには append() を使う
- スライスの要素を削除する機能はないので自分で作る
package main
import (
"fmt"
)
type SliceSample struct {
List []string
}
func (m *SliceSample) Set(value string) {
m.List = append(m.List, value)
}
func (s *SliceSample) Remove(index int) {
res := []string{}
for i, v := range s.List {
if i == index {
continue
}
res = append(res, v)
}
s.List = res
}
func print(v interface{}) {
fmt.Print(v)
fmt.Print("\n")
}
func main() {
ss := new(SliceSample)
print(ss.List)
// 追加
ss.Set("test")
ss.Set("test2")
ss.Set("test3")
print(ss.List)
// 削除
ss.Remove(0)
// 存在しない要素を削除してみる
ss.Remove(10)
print(ss.List)
}
マップの追加・削除
マップは連想配列にあたる。
要素を追加&削除する
- 要素を追加する際に nil チェックをしないとバグの原因になったりする
- 要素を削除するには delete() を使う
package main
import (
"fmt"
)
type MapSample struct {
List map[string]int
}
func (m *MapSample) Set(key string, value int) {
if m.List == nil {
m.List = map[string]int{}
}
m.List[key] = value
}
func (m *MapSample) Remove(key string) {
delete(m.List, key)
}
func print(v interface{}) {
fmt.Print(v)
fmt.Print("\n")
}
func main() {
ms := new(MapSample)
print(ms.List)
// 追加
ms.Set("test", 123)
ms.Set("test2", 456)
ms.Set("test3", 789)
print(ms.List)
// 削除
ms.Remove("test")
// 存在しない要素を削除してみる
ms.Remove("test4")
print(ms.List)
}