Go言語のお勉強 その4

4日目

データ型

Array

var a1 [5]int
fmt.Println(a1)		// [0 0 0 0 0]
a1[0] = 2
fmt.Println(a1)		// [2 0 0 0 0]

var a3 [2][3]int
fmt.Println(a3)		// [[0 0 0] [0 0 0]]

a2 := [4]string{"hoge", "huga", "foo", "bar"}
fmt.Println(a2)		// [hoge huga foo bar]
fmt.Println(a2[:3])	// [hoge huga foo]
fmt.Println(a2[2:3])	// [foo]
fmt.Println(a2[2:])	// [foo bar]
fmt.Println(len(a2))	// 4
  • [要素数]型でArray型を表現する
  • 宣言と同時に初期化するには[要素数]型{ 値を列挙 }で表現する
  • 多重配列も利用可能
    • [n1][n2]type[n1]([n2]type)と等価
  • 値へアクセスするには変数名[インデックス]と表現する
    • インデックスは0から始まる
  • :を使うことで範囲を指定してアクセスすることもできる
  • 後からサイズを変更することはできない
    • そういったときはSliceを使う

Slice

var s1 []int
fmt.Println(s1)			// []
s2 := []int{10, 20, 30, 40, 50}
fmt.Println(s2)			// [10 20 30 40 50]
var s3 []int = make([]int, 3, 4)
fmt.Println(s3)			//[0 0 0]
s3[3] = 1
fmt.Println(s3)			//[0 0 0]

s4 := a2[:]			// a2 == [hoge huga foo bar]
fmt.Println(s4)			// [hoge huga foo bar]
a2[1] = "piyo"
fmt.Println(s4)			// [hoge piyo foo bar]

var s4 []int = make([]int, 3, 4)
fmt.Println(s4)			//[0 0 0]
fmt.Println(len(s4))		// 3
fmt.Println(cap(s4))		// 4
s4 = s4[:cap(s4)]		// 長さを拡張
fmt.Println(s4)			// [0 0 0 0]

s4 = []int{10, 20, 30, 40}
s5 := make([]int, len(s4), (cap(s4) + 1))
copy(s5, s4)
fmt.Println(len(s5), cap(s5))	// 4, 5
fmt.Println(s5)				// [10 20 30 40]

s6 := append(s5, 50, 60)
fmt.Println(s6)				// [10 20 30 40 50 60]
  • []型で表現する
  • Sliceの各要素には値へのポインタが格納される
  • ArrayからSliceを生成することができる
    • 同様にSliceからSliceを生成することもできる
  • Sliceは組み込みのmake関数でも生成することができる
    • make([]型, 長さ, 容量)で表現する
    • 容量は省略することもでき,その場合は長さと同じ値が自動で設定される
  • Sliceの長さはその容量まで拡張することができる
  • 容量を拡張するにはmake関数でより大きい容量を指定してSliceを再生成する
  • SliceからSliceへ値をコピーするにはcopy関数を使う
    • copy(dst, src)
  • append関数を使うと容量と長さの拡張を自動で行なってくれる
  • 要素を削除する関数は用意されていないので自分で作る必要がある

Map

m1 := make(map[string]int)
m1["x"] = 10
m1["y"] = 20
fmt.Println(m1["x"])			// 10

delete(m1, "x")
fmt.Println(m1)					// map[y:20]
fmt.Println(m1["x"])			// 0

m2 := map[string]int{"x": 10, "y": 20}
// Undefined
if _, ok := m2["z"]; ok {
	fmt.Println("Defined")
} else {
	fmt.Println("Undefined")
}
  • いわゆる連想配列
  • make(map[Keyの型]Valueの型)
    • Keyにはfunction, Map, Slice型を使用することができない
  • 要素を消すにはdelete関数を使う
  • map[Key]には戻り値が2つある
    • 1つめは指定したキーに対応する値
    • 2つめには値が定義されていたらtrue,未定義の場合はfalseが返る
  • MapはArrayやSliceと異なり各要素に順番がない

range

array1 := [...]int{10, 20, 30}
slice1 := append(array1[:], 40, 50)
map1 := map[string]int{"hoge": 10, "huga": 20}

// index: 0 value: 10
// index: 1 value: 20
// index: 2 value: 30
for i, v := range array1 {
	fmt.Println("index:", i, "value:", v)
}

// index: 0 value: 10
// index: 1 value: 20
// index: 2 value: 30
// index: 3 value: 40
// index: 4 value: 50
for i, v := range slice1 {
	fmt.Println("index:", i, "value:", v)
}

// key: hoge value: 10
// key: huga value: 20
for k, v := range map1 {
	fmt.Println("key:", k, "value:", v)
}
  • Array, Slice, Mapなどの各要素に対するループ処理を実行するときに使う
  • range 変数で2つの戻り値が返る
    • 1つめはインデックス(Mapの場合はキー)
    • 2つめは値
  • Mapは要素に順番を持たないので実行する度に順番が異なる

ここまではほとんどここをなめただけ.
あとは公式ドキュメントとか本とか見ながら細かいところ勉強していこうと思う.

関連記事

comments powered by Disqus