1.ポインタの利用


値渡し

package main

import "fmt"

func main() {
	var value1 int = 10
	var value2 int = value1

	// アドレスを出力してみる
	fmt.Println("---アドレスの出力---")
	fmt.Println("value1:", &value1)
	fmt.Println("value2:", &value2)

	// まずは現時点の値を出力
	fmt.Println("---初期状態の値---")
	fmt.Println("value1:", value1)
	fmt.Println("value2:", value2)

	// valueの内容を変更
	value1 = 20
	fmt.Println("---valueの変更後---")
	fmt.Println("value1:", value1)
	fmt.Println("value2:", value2)

	// pointerの内容を変更
	value2 = 30
	fmt.Println("---pointerの変更後---")
	fmt.Println("value1:", value1)
	fmt.Println("value2:", value2)
}

ポインタを使用

package main

import "fmt"

func main() {
	var value1 int = 10
	var value2 *int = &value1

	// アドレスを出力してみる
	fmt.Println("---アドレスの出力---")
	fmt.Println("value1:", &value1)
	fmt.Println("value2:", value2)

	// まずは現時点の値を出力
	fmt.Println("---初期状態の値---")
	fmt.Println("value1:", value1)
	fmt.Println("value2:", *value2)

	// valueの内容を変更
	value1 = 20
	fmt.Println("---valueの変更後---")
	fmt.Println("value1:", value1)
	fmt.Println("value2:", *value2)

	// pointerの内容を変更
	*value2 = 30
	fmt.Println("---pointerの変更後---")
	fmt.Println("value1:", value1)
	fmt.Println("value2:", *value2)
}

2.関数の引数でのポインタ利用


通常の関数

package main

import "fmt"

func test_func(value int) {
	value = 100
}

func main() {
	// 整数変数の定義
	var value int = 10

	fmt.Println("---初期の値を表示---")
	fmt.Println("value:", value)

	test_func(value)

	fmt.Println("---関数実行後の値を出力---")
	fmt.Println("value:", value)
}

ポインタを利用

package main

import "fmt"

func test_func(value *int) {
	*value = 100
}

func main() {
	// 整数変数の定義
	var value int = 10

	fmt.Println("---初期の値を表示---")
	fmt.Println("value:", value)

	test_func(&value)

	fmt.Println("---関数実行後の値を出力---")
	fmt.Println("value:", value)
}

3.構造体のメソッドでのポインタ利用


ポインタを使わない

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func (person Person) setValue(name string, age int) {
	person.Name = name
	person.Age = age
}

func main() {
	person := Person{
		Name: "テスト太郎",
		Age:  30,
	}

	fmt.Println("---初期の値を表示---")
	fmt.Println(person)

	person.setValue("テスト二郎", 25)

	fmt.Println("---メソッド実行後の値を表示---")
	fmt.Println(person)
}

ポインタを使用する

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func (person *Person) setValue(name string, age int) {
	person.Name = name
	person.Age = age
}

func main() {
	person := Person{
		Name: "テスト太郎",
		Age:  30,
	}
	person.setValue("テスト二郎", 25)
	fmt.Println(person)
	

	fmt.Println("---初期の値を表示---")
	fmt.Println(person)

	person.setValue("テスト二郎", 25)

	fmt.Println("---メソッド実行後の値を表示---")
	fmt.Println(person)
}

練習問題