回答編集履歴

2

add

2017/07/21 10:03

投稿

mattn
mattn

スコア5030

test CHANGED
@@ -19,3 +19,143 @@
19
19
  }
20
20
 
21
21
  ```
22
+
23
+
24
+
25
+ 追記
26
+
27
+
28
+
29
+ どうしても隠ぺいしたいなら、以下の様に全て非公開にすべきです。
30
+
31
+
32
+
33
+ ```go
34
+
35
+ package hoge
36
+
37
+
38
+
39
+ var h = Hoge{str: "OK", slice: []string{"OK"}}
40
+
41
+
42
+
43
+ type Hoge struct {
44
+
45
+ str string
46
+
47
+ slice []string
48
+
49
+ }
50
+
51
+
52
+
53
+ func Get() *Hoge {
54
+
55
+ return &h
56
+
57
+ }
58
+
59
+
60
+
61
+ func (h *Hoge) Str() string {
62
+
63
+ return h.str
64
+
65
+ }
66
+
67
+
68
+
69
+ type mySlice struct {
70
+
71
+ slice []string
72
+
73
+ }
74
+
75
+
76
+
77
+ func (h *Hoge) Slice() *mySlice {
78
+
79
+ return &mySlice{h.slice}
80
+
81
+ }
82
+
83
+
84
+
85
+ func (ms mySlice) Get(i int) string {
86
+
87
+ return ms.slice[i]
88
+
89
+ }
90
+
91
+
92
+
93
+ func (ms mySlice) Len() int {
94
+
95
+ return len(ms.slice)
96
+
97
+ }
98
+
99
+ ```
100
+
101
+
102
+
103
+ この場合、以下の様なアクセスになります。
104
+
105
+
106
+
107
+ ```go
108
+
109
+ package main
110
+
111
+
112
+
113
+ import (
114
+
115
+ "fmt"
116
+
117
+
118
+
119
+ "./hoge"
120
+
121
+ )
122
+
123
+
124
+
125
+ func main() {
126
+
127
+ // 元の値
128
+
129
+ a := hoge.Get()
130
+
131
+ fmt.Println("string: " + a.Str() + " slice: " + a.Slice().Get(0))
132
+
133
+
134
+
135
+ // 値を変更
136
+
137
+
138
+
139
+ // 変更できない
140
+
141
+ // a.Str() = "NG"
142
+
143
+
144
+
145
+ // これもだめ
146
+
147
+ // a.Slice()[0] = "NG"
148
+
149
+ fmt.Println("string: " + a.Str() + " slice: " + a.Slice().Get(0))
150
+
151
+
152
+
153
+ // スライスだけ値が上書きされている
154
+
155
+ fmt.Println("string: " + hoge.Get().Str() + " slice: " + hoge.Get().Slice().Get(0))
156
+
157
+ }
158
+
159
+ ```
160
+
161
+

1

typo

2017/07/21 10:03

投稿

mattn
mattn

スコア5030

test CHANGED
@@ -1,4 +1,4 @@
1
- スライスはリファレンスなので更新できてしまいます。また golang には const の様な物がないので Get でコピーを返すくらしか方法はないと思います。
1
+ スライスはリファレンスなので更新できてしまいます。また golang には const の様な物がないので Get でコピーを返すくらしか方法はないと思います。
2
2
 
3
3
 
4
4