Created
June 27, 2017 13:24
-
-
Save yoshinoyaussie/85148d27abdd77feb08ffbd56f61007a to your computer and use it in GitHub Desktop.
Go言語の構造体の値渡しとポインタ渡しの動作を確認してみる
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"reflect" | |
) | |
// ST1 は文字列とmap[string]stringを持つ構造体です。 | |
type ST1 struct { | |
f1 string | |
f2 map[string]string | |
} | |
func (s ST1) a() { | |
} | |
// IF1 は関数a()を持つinterfaceです。 | |
type IF1 interface { | |
a() | |
} | |
func main() { | |
fmt.Println("*** ST1は文字列とmap[string]stringの2つのフィールドを持っています。") | |
fmt.Println("*** 1.値渡しでフィールドの値を変更した場合") | |
s1 := ST1{"", map[string]string{}} | |
fmt.Printf("1: s1 = %#v\n", s1) | |
F1(s1) | |
fmt.Printf("2: s1 = %#v\n", s1) | |
fmt.Println("*** 2.ポインタ渡しでフィールドの値を変更した場合") | |
s1 = ST1{"", map[string]string{}} | |
fmt.Printf("1: s1 = %#v\n", s1) | |
F2(&s1) | |
fmt.Printf("2: s1 = %#v\n", s1) | |
fmt.Println("*** 3.interfaceの値渡しでフィールドの値を変更した場合") | |
s1 = ST1{"", map[string]string{}} | |
fmt.Printf("1: s1 = %#v\n", s1) | |
F3(s1) | |
fmt.Printf("2: s1 = %#v\n", s1) | |
fmt.Println("*** 4.interfaceのポインタ渡しでフィールドの値を変更した場合") | |
s1 = ST1{"", map[string]string{}} | |
fmt.Printf("1: s1 = %#v\n", s1) | |
F4(&s1) | |
fmt.Printf("2: s1 = %#v\n", s1) | |
fmt.Println("*** 5.interface側でポインタ渡しか値渡しか確認する") | |
s1 = ST1{"", map[string]string{}} | |
F5(s1) | |
F5(&s1) | |
} | |
// F1 は構造体の値渡しでフィールドの値を変更します。 | |
func F1(s ST1) { | |
s.f1 = "f1" | |
s.f2["f2"] = "test" | |
} | |
// F2 は構造体のポインタ渡しでフィールドの値を変更します。 | |
func F2(s *ST1) { | |
s.f1 = "f1" | |
s.f2["f2"] = "test" | |
} | |
// F3 はinterfaceの値渡しでフィールドの値を変更します。 | |
func F3(i IF1) { | |
if s, ok := i.(ST1); ok { | |
s.f1 = "f1" | |
s.f2["f2"] = "test" | |
} else { | |
fmt.Println("error: パラメータが ST1 ではありません") | |
} | |
} | |
// F4 はinterfaceのポインタ渡しでフィールドの値を変更します。 | |
func F4(i IF1) { | |
if s, ok := i.(*ST1); ok { | |
s.f1 = "f1" | |
s.f2["f2"] = "test" | |
} else { | |
fmt.Println("error: パラメータが *ST1 ではありません") | |
} | |
} | |
// F5 はinterfaceに渡されたパラメータが値渡しかポインタ渡しか確認します。 | |
func F5(i IF1) { | |
if reflect.TypeOf(i).Kind() == reflect.Ptr { | |
fmt.Println("i はポインタ渡しです") | |
} else { | |
fmt.Println("i は値渡しです") | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
本コードの詳細については以下のQiita記事を参照してください。
http://qiita.com/y_ussie/items/ee520f9fe62d58d9610f