34 ポインタ
package main
import "fmt"
func main() {
var v int = 10
fmt.Println(v)
fmt.Println(&v)
var p *int = &v
fmt.Println(p)
fmt.Println(*p)
}
実行結果.go
10
0xc0000160c8
0xc0000160c8
10
36 struct
package main
import "fmt"
type Vertex struct {
X, Y int
S string
}
func main() {
v := Vertex{X: 1, Y: 2, S: "ver"}
fmt.Println(v)
v4 := Vertex{}
fmt.Printf("%T %v\n", v, v4)
var v5 Vertex
fmt.Printf("%T %v\n", v5, v5)
// ポインタ
v6 := new(Vertex)
fmt.Printf("%T %v\n", v6, v6)
// 推奨
v7 := &Vertex{}
fmt.Printf("%T %v\n", v7, v7)
// スライス
// 推奨
s1 := make([]int, 0)
fmt.Println(s1)
s2 := []int{}
fmt.Println(s2)
}
v4,v5の方法で制限するやり方と、v6,v7のやり方では違うものが宣言されているので注意。
ポインタとしての宣言方法はv7のほうが推奨されている(アンパサンドがついていてポインタを定義しているとわかりやすい)
同様にスライスも定義の仕方が複数あるが、s1のほうが推奨されている
※この講座自体少し前の情報のため変わっているかも
package main
import "fmt"
type Vertex struct {
X, Y int
S string
}
func changeVertex(v Vertex) {
v.X = 1000
}
func changeVertex2(v *Vertex) {
v.X = 1000
}
func main() {
v := Vertex{X: 1, Y: 2, S: "ver"}
changeVertex(v)
fmt.Println(v)
v2 := &Vertex{X: 1, Y: 2, S: "ver"}
changeVertex2(v2)
fmt.Println(v2)
}
実行結果.go
{1 2 ver}
{1000 2 ver}
構造体の値を書き換えたいとき
vはchangeVertex()の関数内でのみ変数が書き換わるが、mainには影響がない。
書き換えたい場合はv2のように、構造体を宣言する際にアンパサンド&をつける。
changeVertex2()を実行するときに渡しているのは、構造体が格納されているメモリのアドレスになる。
関数の引数にアスタリスクをつければ、渡ってきたメモリのアドレスから中身を参照することができるため、値を書き換える事ができる。