2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go言語で書く値渡しとポインタ渡し

2
Last updated at Posted at 2019-06-22

値渡しと参照(ポインタ)渡し

以前にPHPで値渡しと参照渡しについて書きましたが、同じ話題がGo言語の基礎を学習する際に再び出てきたのでその時に書いたソースコードを備忘録として載せておく記事です

Person.go
package main

import (
	"fmt"
)

func main() {
	RelativeCopyTest()
}

// 人の情報を表す構造体
type Person struct {
	Name string
	Age  int
}

func RelativeCopyTest() {

	//佐藤さんを定義
	sato := Person{
		Name: "佐藤",
		Age:  20,
	}

	fmt.Println("------------佐藤さんの定義-----------")
	fmt.Printf("佐藤さんの情報:%+v\n", sato) //ここでは、佐藤さんの情報が表示される

	/* -----値渡し---- */
	tanaka := sato //田中さんに佐藤さんのプロフィールをコピーして渡す
	tanaka.Name = "田中"
	tanaka.Age = 30

	fmt.Println("------------値渡し-----------")
	fmt.Printf("佐藤さんの情報:%+v\n", sato)   //佐藤さんの情報は書き変わらない
	fmt.Printf("田中さんの情報:%+v\n", tanaka) //田中さんの情報も表示される
	// NOTE: '%+v'と表記することで、構造体のフィールドと値を綺麗な形で出力してくれる

	/* -----ポインタ渡し----- */
	brian := &sato //Brianに佐藤さんのアドレス情報を渡す
	brian.Name = "ブライアン"
	brian.Age = 100

	fmt.Println("----------ポインタ渡し-------------")
	fmt.Printf("佐藤さんの情報:%+v\n", sato)  //佐藤さんの情報はBrianの情報に書き換わってしまう
	fmt.Printf("佐藤さんの情報:%+v\n", brian) //Brianの情報も保持されたまま
}

実行結果

----------佐藤さんの定義-------------
佐藤さんの情報:{Name:佐藤 Age:20}
----------値渡し-------------
佐藤さんの情報:{Name:佐藤 Age:20}
田中さんの情報:{Name:田中 Age:30}
-----------ポインタ渡し------------
佐藤さんの情報:{Name:ブライアン Age:100}
佐藤さんの情報:&{Name:ブライアン Age:100}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?