Empfänger nach Wert vs Empfänger nach Zeiger Verwirrung [Duplikat]
Dec 28 2020
Ich habe eine einfache Stack-Implementierung geschrieben. Dies funktioniert wie erwartet.
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)
}
}
Wenn ich jedoch die drei Methoden von Empfänger nach Zeiger auf Empfänger nach Wert wie unten geändert habe. Dann druckt der Main nichts. Es scheint, dass jedes Mal, wenn ich die Push-Methode aufrufe, der Stack neu initialisiert wird. Warum das?
func (s Stack) isEmpty() bool {
func (s Stack) push(item interface{}) {
func (s Stack) pop() interface{} {
Antworten
1 LunaLovegood Dec 28 2020 at 11:15
Im Wertempfänger erstellt Go eine Kopie der Variablen und nimmt Änderungen an der Kopie vor. Nur im Referenzempfänger wird die aktuelle stack
Variable aktualisiert.
Für mehr Details, https://tour.golang.org/methods/4