Penerima berdasarkan nilai vs penerima dengan kebingungan penunjuk [duplikat]

Dec 28 2020

Saya telah menulis implementasi stack sederhana. Ini bekerja seperti yang diharapkan.

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

Namun, jika saya mengubah tiga metode dari penerima dengan penunjuk ke penerima dengan nilai seperti di bawah ini. Kemudian utama tidak mencetak apa pun. Tampaknya setiap kali saya menelepon metode push, tumpukan diinisialisasi ulang. Mengapa demikian?

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

Jawaban

1 LunaLovegood Dec 28 2020 at 11:15

Penerima nilai Go membuat salinan variabel dan membuat perubahan pada salinannya. Hanya dalam penerima referensi, stackvariabel aktual diperbarui.

Untuk lebih jelasnya, https://tour.golang.org/methods/4