On Mon, Oct 7, 2024 at 10:29 AM Ken Lee <ken.lee.kiany...@gmail.com> wrote:
>
> ---
> There is a consideration to make, though: historically it has been considered 
> bad form in Go to give a type a mix of value and pointer receivers in methods 
> without a very specific reason for doing so.
> ---
>
> Is this still the case now? As in 2024.

As a general guideline, yes.

https://go.dev/wiki/CodeReviewComments#receiver-type

Ian



> On Sunday 13 January 2013 at 7:03:29 am UTC+8 Kevin Gillette wrote:
>>
>> Indeed. In addition to implicit dereferencing for value receivers, the 
>> reverse also works as well: anything that is addressable (including 'value' 
>> variables on the stack, or a field of element of anything that's 
>> addressable) will implicitly be addressed when a pointer-receiver method is 
>> called on them (though you must explicitly use the address operator when you 
>> need to pass value variables as pointers).
>>
>> There is a consideration to make, though: historically it has been 
>> considered bad form in Go to give a type a mix of value and pointer 
>> receivers in methods without a very specific reason for doing so. The 
>> typical justification is that a small struct in a getter method might as 
>> well have a value receiver even though the corresponding setter method uses 
>> a pointer receiver; this, however, can lead to confusion on the part of the 
>> app programmer if they start out using only the read-only methods upon what 
>> turns out to be a value-copy of the original (but hey, it compiled and seems 
>> to work, so it must be correct) -- when use of pointer-receiver methods 
>> don't seem to produce the documented changes in the original, it can be 
>> difficult to debug.
>>
>>
>> On Saturday, January 12, 2013 3:17:16 PM UTC-7, Dave Collins wrote:
>>>
>>> On Saturday, January 12, 2013 3:52:35 PM UTC-6, Taric Mirza wrote:
>>>>
>>>> Thanks!  Works like a charm and is helping cleaning up my code a ton.
>>>>
>>>> One other question, this is really more about coding style:
>>>>
>>>> In the case where you manipulate members of the struct, then using
>>>> pointers as in your example is the way to go.
>>>>
>>>> But, you have a choice for functions that just read values from the
>>>> struct instead of manipulating it.  Is there a best practice coding
>>>> style here, between dereferencing the struct and then using that, or
>>>> dereferencing each member of the struct as you go?  eg:
>>>>
>>>> // A:
>>>>
>>>> laser := worldobj.(*Laser)
>>>> fmt.Printf("%0.4f,%0.4f", (*laser).x, (*laser).y)
>>>>
>>>> versus
>>>>
>>>> // B:
>>>>
>>>> laser := *(worldobj.(*Laser))
>>>> fmt.Printf("%0.4f,%0.4f", laser.x, laser.y)
>>>>
>>>>
>>>> I'm kind of torn.   I would imagine A) has slightly better
>>>> performance, and doesn't require any code-rework if you later on need
>>>> to manipulate the struct.
>>>>
>>>> On the other hand, B) is more readable since you don't have to look at
>>>> pointers all over the place, just on one line.
>>>
>>>
>>> Actually, you don't need to dereference at all.  Go automatically handles 
>>> this for you.
>>>
>>> See this example:  http://play.golang.org/p/ANaKaFSQLn
>>>
> --
> 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/03df7dce-5c48-44a3-bc3c-851ded2a1f08n%40googlegroups.com.

-- 
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/CAOyqgcX7v9Edk5beRH38tfJO18ZUXv-nOHsEPPCfMQy0hz%3DFdw%40mail.gmail.com.

Reply via email to