### Pointers
Go has pointers. A pointer holds the memory address of a value.
The type *T is a pointer to a T value. Its zero value is nil
func main(){ i, j := 42, 2701 p := &i fmt.Println(*p) *p = 21 fmt.Println(i) p = &j *p = *p / 37 fmt.Println(j) }
$ go build hello.go && ./hello
42
21
73
### Structs
A struct is a collection of fields.
type Vertex struct { X int Y int } func main(){ fmt.Println(Vertex{1, 2}) }
Struct fields are accessed using a dot.
type Vertex struct { X int Y int } func main(){ v := Vertex{1, 2} v.X = 4 fmt.Println(v.X) }
Pointers to structs
type Vertex struct { X int Y int } func main(){ v := Vertex{1, 2} p := &v p.X = 1e9 fmt.Println(v) }
$ go build hello.go && ./hello
{1000000000 2}
– Struct Literals
A struct literal donates a newly allocated struct value by listing the values of its fields.
var ( v1 = Vertex{1, 2} v2 = Vertex{X: 1} v3 = Vertex{} p = &Vertex{1, 2} ) func main(){ fmt.Println(v1, p, v2, v3) }
$ go build hello.go && ./hello
{1 2} &{1 2} {1 0} {0 0}
### Arrays
The type [n]T is an array of n values of type T.
func main(){ var a [2]string a[0] = "Hello" a[1] = "world" fmt.Println(a[0], a[1]) fmt.Println(a) primes := [6]int{2, 3, 5, 7, 11, 13} fmt.Println(primes) }
$ go build hello.go && ./hello
Hello world
[Hello world]
[2 3 5 7 11 13]
– Slices
An array has a fixed size. A slice, on the other hand, is a dynamically-sized, flexible view into the elements of an array.
func main(){ primes := [6]int{2, 3, 5, 7, 11, 13} var s []int = primes[1:4] fmt.Println(s) }
– Slices are like references to arrays
A slice does not store any data, it just describes a section of an underlying array.
func main(){ names := [4]string{ "John", "Paul", "George", "Ringo", } fmt.Println(names) a := names[0:2] b := names[1:3] b[0] = "XXX" fmt.Println(a, b) fmt.Println(names) }
$ go build hello.go && ./hello
[John Paul George Ringo]
[John XXX] [XXX George]
[John XXX George Ringo]
– Slice literals
A slice literal is like an array literal without the length.
func main(){ q := []int{2, 3, 5, 7, 11, 13} fmt.Println(q) r := []bool{true, false, true, true, false, true} fmt.Println(r) s := []struct { i int b bool }{ {2, true}, {3, false}, {5, true}, {7, true}, {11, false}, {13, true}, } fmt.Println(s) }
C言語をやってからポインターは暫く離れていたが、Goもポインター使うのか。