値によるレシーバーとポインターによるレシーバーの混乱[重複]
簡単なスタック実装を作成しました。これは期待どおりに機能します。
package main
import "fmt"
type Stack struct {
data []interface{}
}
func (s *Stack) isEmpty() bool {
return len(s.data) == 0
}
func (s *Stack) push(item interface{}) {
s.data = append(s.data, item)
//fmt.Println(s.data, item)
}
func (s *Stack) pop() interface{} {
if len(s.data) == 0 {
return nil
}
index := len(s.data) - 1
res := s.data[index]
s.data = s.data[:index]
return res
}
func main() {
var stack Stack
stack.push("this")
stack.push("is")
stack.push("sparta!!")
for len(stack.data) > 0 {
x := stack.pop()
fmt.Println(x)
}
}
ただし、以下のように、3つの方法をポインターによるレシーバーから値によるレシーバーに変更した場合。その後、メインは何も印刷しません。pushメソッドを呼び出すたびに、スタックが再初期化されるようです。何故ですか?
func (s Stack) isEmpty() bool {
func (s Stack) push(item interface{}) {
func (s Stack) pop() interface{} {
回答
1 LunaLovegood
値レシーバーでは、Goは変数のコピーを作成し、そのコピーに変更を加えます。参照レシーバーでのみ、実際のstack
変数が更新されます。
詳細については、 https://tour.golang.org/methods/4