値渡しと参照(ポインタ)渡し
以前に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}