Receveur par valeur vs récepteur par confusion du pointeur [dupliquer]

Dec 28 2020

J'ai écrit une implémentation de pile simple. Cela fonctionne comme prévu.

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)
    }
}

Cependant, si j'ai changé les trois méthodes du récepteur par pointeur au récepteur par valeur comme ci-dessous. Ensuite, le principal n'imprime rien. Il semble que chaque fois que j'appelle la méthode push, la pile est réinitialisée. Pourquoi donc?

func (s Stack) isEmpty() bool {
func (s Stack) push(item interface{}) {
func (s Stack) pop() interface{} {

Réponses

1 LunaLovegood Dec 28 2020 at 11:15

En valeur, le récepteur Go fait une copie de la variable et modifie la copie. La stackvariable réelle est mise à jour uniquement dans le récepteur de référence .

Pour plus de détails, https://tour.golang.org/methods/4