मुझे Google पर *interface{} के बारे में कुछ भी नहीं मिल रहा है। तो... सवाल यह है कि ये दो दृष्टिकोण अलग-अलग क्यों काम करते हैं?

package main

type MyStruct struct {}

func valI(x interface{}) {}
func pointI(x *interface{}) {}

func valS(s MyStruct) {}
func pointS(s *MyStruct) {}

func main() {
    s := MyStruct{}
    p := &s

    valI(s)
    valI(p) // Why? Success
    pointI(s) // Why?  Fail: cannot use s (type S) as type *interface {} in argument to point: *interface {} is pointer to interface, not interface
    pointI(p) // Why?  Fail: cannot use p (type *S) as type *interface {} in argument to point: *interface {} is pointer to interface, not interface

    valS(s)
    valS(p) // It's obvious to me why these two fail
    pointS(s) // -//-
    pointS(p)
}

खेल का मैदान: https://play.golang.org/p/pio5vf-fBxH

go
-1
Stanislav 18 जून 2020, 19:44

1 उत्तर

सबसे बढ़िया उत्तर

एक इंटरफ़ेस में अंतर्निहित डेटा और प्रकार की जानकारी के लिए एक सूचक होता है। जब आप किसी इंटरफ़ेस को गैर-इंटरफ़ेस मान निर्दिष्ट करते हैं (या इंटरफ़ेस तर्क के रूप में एक गैर-इंटरफ़ेस मान पास करते हैं) तो संकलक अंतर्निहित डेटा के प्रकार और सूचक को पास करने के लिए कोड उत्पन्न करता है। एक तरह से, एक इंटरफ़ेस एक संरचना है:

type interface struct {
   Data pointer
   Type type
}

एक इंटरफ़ेस के लिए एक सूचक इस संरचना के उदाहरण के लिए बस एक सूचक है।

सभी मान interface{} इंटरफ़ेस को संतुष्ट करते हैं, ताकि आप एक स्ट्रक्चर या *स्ट्रक्चर पास कर सकें जहां interface{} की आवश्यकता हो। *interface{} एक इंटरफ़ेस के लिए एक सूचक है, और केवल एक इंटरफ़ेस के लिए एक सूचक पारित किया जा सकता है:

x:=interface{}(s)
pointI(&x)
2
Burak Serdar 18 जून 2020, 16:50