/
04_function_method_pointer.go
108 lines (84 loc) · 2.05 KB
/
04_function_method_pointer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import "fmt"
type Flags struct {
Key string
}
type Data struct {
Flags Flags
}
type DataPointer struct {
Flags *Flags
}
// X
func functionData1(d Data) {
d.Flags.Key = "updated by functionData1"
}
// O
func functionData2(d *Data) {
d.Flags.Key = "updated by functionData2"
}
// X
func (d Data) methodData1() {
d.Flags.Key = "updated by methodData1"
}
// O
func (d *Data) methodData2() {
d.Flags.Key = "updated by methodData2"
}
// O
func functionDataPointer1(d DataPointer) {
d.Flags.Key = "updated by functionDataPointer1"
}
// O
func functionDataPointer2(d *DataPointer) {
d.Flags.Key = "updated by functionDataPointer2"
}
// O
func (d DataPointer) methodDataPointer1() {
d.Flags.Key = "updated by methodDataPointer1"
}
// O
func (d *DataPointer) methodDataPointer2() {
d.Flags.Key = "updated by methodDataPointer2"
}
func main() {
f := Flags{Key: ""}
data := Data{}
data.Flags = f
dataPointer := DataPointer{}
dataPointer.Flags = &f
// X
functionData1(data)
fmt.Println("after functionData1:", data)
// O
functionData2(&data)
fmt.Println("after functionData2:", data)
// X
data.methodData1()
fmt.Println("after methodData1:", data)
// O
(&data).methodData2()
fmt.Println("after methodData2:", data)
// O
functionDataPointer1(dataPointer)
fmt.Println("after functionDataPointer1:", dataPointer.Flags)
// O
functionDataPointer2(&dataPointer)
fmt.Println("after functionDataPointer2:", dataPointer.Flags)
// O
dataPointer.methodDataPointer1()
fmt.Println("after methodDataPointer1:", dataPointer.Flags)
// O
(&dataPointer).methodDataPointer2()
fmt.Println("after methodDataPointer2:", dataPointer.Flags)
}
/*
after functionData1: {{}}
after functionData2: {{updated by functionData2}}
after methodData1: {{updated by functionData2}}
after methodData2: {{updated by methodData2}}
after functionDataPointer1: &{updated by functionDataPointer1}
after functionDataPointer2: &{updated by functionDataPointer2}
after methodDataPointer1: &{updated by methodDataPointer1}
after methodDataPointer2: &{updated by methodDataPointer2}
*/