पॉइंटर कन्फ्यूजन [डुप्लिकेट] द्वारा मूल्य बनाम रिसीवर द्वारा रिसीवर

Dec 28 2020

मैंने एक साधारण स्टैक कार्यान्वयन लिखा है। यह उम्मीद के मुताबिक काम करता है।

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

हालाँकि, अगर मैंने रिसीवर के तीन तरीकों को पॉइंटर द्वारा रिसीवर से रिसीवर तक नीचे के रूप में बदल दिया। फिर मुख्य कुछ भी नहीं छापता है। ऐसा लगता है कि हर बार मुझे पुश पद्धति कहा जाता है, स्टैक को फिर से संगठित किया जाता है। ऐसा क्यों?

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

जवाब

1 LunaLovegood Dec 28 2020 at 11:15

मूल्य रिसीवर में, गो चर की एक प्रतिलिपि बनाता है और प्रतिलिपि में परिवर्तन करता है। केवल संदर्भ रिसीवर में वास्तविक stackचर अद्यतन हो जाता है।

अधिक जानकारी के लिए, https://tour.golang.org/methods/4