Skip to content

Instantly share code, notes, and snippets.

@yoshinoyaussie
Created June 27, 2017 13:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yoshinoyaussie/85148d27abdd77feb08ffbd56f61007a to your computer and use it in GitHub Desktop.
Save yoshinoyaussie/85148d27abdd77feb08ffbd56f61007a to your computer and use it in GitHub Desktop.
Go言語の構造体の値渡しとポインタ渡しの動作を確認してみる
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 は値渡しです")
}
}
@yoshinoyaussie
Copy link
Author

本コードの詳細については以下のQiita記事を参照してください。
http://qiita.com/y_ussie/items/ee520f9fe62d58d9610f

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment