If you assign a value to an interface, it will get copied. That's the same
as if you assign an int to another int - it will get copied. If you want
the interface to contain a reference, you have to assign a pointer to it:
https://go.dev/play/p/nLw51pjWh4u

Side note: Go doesn't have "instances". It has "variables", which is
*probably* what you mean.

On Fri, Nov 25, 2022 at 10:55 AM Denis P <denis.puj...@gmail.com> wrote:

> Thank you everyone for your help.
> The problem still exists.
> I am looking for a solution where s and s2 point to the same instance.
> The current example proves they are different instances.
> https://go.dev/play/p/_JyfJelhIy4
>
> The main goal is to store any type in a wrapper and then get the reference
> of the actual struct.
> Also it must be the same instance, so the println should print 2, 2, 2
>
> But look like there is no obvious solution. :-(
>
> On Friday, 25 November 2022 at 08:19:17 UTC Brian Candler wrote:
>
>> To give a real-world example:
>>
>> https://pkg.go.dev/github.com/prometheus/client_golang/prometheus
>>
>> type metrics struct {
>>         cpuTemp    prometheus.Gauge
>>         hdFailures *prometheus.CounterVec
>> }
>>
>> Question: why is prometheus.Gauge not a pointer, but
>> *prometheus.CounterVec is a pointer?
>>
>> Answer: because prometheus.Gauge is an interface, whereas
>> prometheus.CounterVec is a struct.
>>
>> An interface essentially already *contains* a pointer to a data value -
>> in fact, a tuple of (type, pointer).  So you should never take a pointer to
>> an interface.  Just pass the interface value, and it will copy the (type,
>> pointer) pair.
>>
>> However, when you extract a value from an interface, it *will* always
>> copy the internal value.  This avoids aliasing issues: someone who passes
>> an interface value to someone else, won't expect the recipient to be able
>> to change the sender's copy.
>>
>> e.g.
>> https://go.dev/play/p/u5y3Kwm9Ydz
>>
>> Of course, if your interface *contains* a pointer, then the recipient of
>> the interface can modify the thing being pointed to.
>> https://go.dev/play/p/o_XAJtNuyGF
>>
>> But they can't modify the pointer itself held within the interface, to
>> make it point to something else.
>>
>> The short version is: avoid pointers to interfaces, as the FAQ says.
>> Instead, let a concrete pointer value satisfy an interface.
>>
>> On Friday, 25 November 2022 at 07:40:59 UTC Nigel Tao wrote:
>>
>>> Possibly relevant:
>>> https://go.dev/doc/faq#pointer_to_interface
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/948dc8f3-385e-4f50-a44b-ddf4792e6362n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/948dc8f3-385e-4f50-a44b-ddf4792e6362n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfE7XX%2BnHJTW36GaoLjQWidY7GCjpHP1zyOJJzMcSq13JA%40mail.gmail.com.

Reply via email to