[Go言語 入門] ポインタ型の構造体
golangで作ってみたいものがあり、golangを学び始めたので学習したことを書いていくノート。
---------------------------------------------------
サイトマップはこちら
---------------------------------------------------
第14回 ポインタ型の構造体
構造体を値として定義する場合は以下のように宣言する。
// main.go
type Person struct {
Name string
Age int
}
func main() {
taro := Person{}
var jiro Person
fmt.Printf("%T %v\n", taro, taro)
fmt.Printf("%T %v\n", jiro, jiro)
}
// 実行結果
// main.Person { 0}
// main.Person { 0}
では、ポインタ型として定義する場合はどのように宣言するか。
ポインタ型の構造体は以下のよう宣言する。
「 変数名 := new( 構造体名 ) 」
「 変数名 := &構造体名{ } 」
func main() {
hana := new(Person)
hina := &Person{}
fmt.Printf("%T %v\n", hana, hana)
fmt.Printf("%T %v\n", hina, hina)
}
// 実行結果
// *main.Person { 0}
// *main.Person { 0}
実行結果より、ポインタが返ってきていることが確認できる。
~ 渡す値による影響の違い ~
他の関数に、値を渡す場合とアドレスを渡す場合による違いは以下
type Person struct {
Name string
Age int
}
func addAge(p Person) {
p.Age += 10
}
func addAge_pointer(p *Person) {
p.Age += 10
}
func main() {
taro := Person{}
hana := new(Person)
addAge(taro)
addAge_pointer(hana)
fmt.Println(taro)
fmt.Println(hana)
}
// 実行結果
// { 0}
// &{ 10}
別の関数に値を渡す場合は、値のみを渡しているため、addAge関数を実行しても taro の年齢自体には影響がない。
アドレスを渡した場合は、アドレスの中身を書き換えるため、上記の場合はhana の年齢「0」を +10 する addAge_pointer 関数により、hana の年齢は「10」となる。
【重要】アドレスを渡した場合、宣言した変数の値に影響がある!
以上