0
Help us understand the problem. What are the problem?

posted at

updated at

【Golang】ポインタまとめ

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()を実行するときに渡しているのは、構造体が格納されているメモリのアドレスになる。
関数の引数にアスタリスクをつければ、渡ってきたメモリのアドレスから中身を参照することができるため、値を書き換える事ができる。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?