Yuri’s Tech Note

技術系アウトプット

A Tour of Go vol.4 (Pointer / Array / Slice)

ここから本格的な学び

Pointer

値のメモリのアドレスのこと。

ポインターの型

変数variableのポインタは *variable型
ゼロ値はnil

&オペレータ

オペレータ(=演算子)
オペランド(=被演算子)
Goでは&オペレーターがあり、オペランドへのポインタを引き出す。

i := 42
p = &i
fmt.Println(*p) // ポインタpを通してiから値を読みだす
*p = 21         // ポインタpを通してiへ値を代入する

この時変数*pはアドレスの情報のみを持っているため、メモリに記憶する情報が少なくて済む。
大きな構造体などをそのまま変数に格納するよりもアドレスを格納した方がメモリが節約できる。

type

既存の型や型リテラルに別名をつけることができる。

type Vertex struct {
	X int
	Y int
}

上記はstruct型をVertexという別名の型にしている。
typeについては下記の記事が言語仕様に則って説明してくれている。
Goを学びたての人が誤解しがちなtypeと構造体について #golang

Array

[n]T
n:配列の要素数
T:配列の型
配列の長さは変えることができない。

Slice

スライスは配列への参照のようなものであり、スライスの要素変更は元の配列に影響する。
よって同じ元となる配列を共有している他のスライスは、それらの変更が反映される。
ゼロ値はnil

[]T
固定長の配列に対し、スライスは可変長。

primes := [6]int{1,2,3,4,5,6}
var s []int = primes[1:4] //2, 3, 4
例)構造体を要素とする配列

複数のフィールドを持つオブジェクトを要素とする配列は下記の用に作る。

s := []struct {
    i int
    b bool
}{
    {2, true},
    {3, false},
    {5, true},
}
capacity

スライスはスライスの最初の要素から数えて、元となる配列の要素数をcapacityとして持つ。
スライス s の長さと容量は len(s) と cap(s) という式を使用して得る。

a := make([]int, 5)
// len=5 cap=5 [0 0 0 0 0]

b := make([]int, 0, 5)
// len=0 cap=5 []

c := b[:2]
// len=2 cap=5 [0 0]

d := c[2:5]
// len=3 cap=3 [0 0 0]
要素の追加

スライスへの新しい要素の追加はappend関数を使う。

var s []int
// cap=0 []

s = append(s, 2, 3)
// len=2 cap=2 [2 3]