I find that people coming to Go from C++ tend to use pointers everywhere so 
as to avoid copying of structs.
Once they get a bit more experience, they tend to use fewer pointers, and 
are happier to pass structs around.
Removing the "make everything a pointer" optimisation makes the code 
simpler, and often actually makes it run faster
as fewer values escape the heap. Allocation tends to dominate Go runtime, 
so it is worth doing a bit more
copying in order to get a bit less allocations. 

On Saturday, 5 June 2021 at 22:34:09 UTC+1 axel.wa...@googlemail.com wrote:

> I would add that because the dynamic type of an interface value is not 
> known at compile time, a variable of interface type really can't (in 
> general) have a specific size.
> If a function has an interface parameter, it must be possible to pass a 
> value of *any* size to it. So even aside from what the current 
> implementation does - any Go compiler must, in general¹, consider 
> interfaces to be pretty-much-pointers.
>
> "in general" because a compiler can, of course, determine that in a 
> certain scenario the value doesn't have to be packed and pass it as-is. 
> This is an optimization sometimes called "devirtualization". But in the 
> general case, a compiler can't prove that (e.g. the dynamic value in an 
> interface could be determined by a random number generator), so it will 
> always be an optimization and the default always has to be a form of boxing 
> into a constantly sized shape.
>
> All of this is a good indication, from first principles, that you don't 
> have to worry about the size of the dynamic value when passing it.
>
> What's more, in general you should trust the author of the package you are 
> using to give you a reasonable implementation of an interface. You 
> shouldn't worry what the dynamic type and value in an interface is, unless 
> you have very good reason to care. In this case, unless you notice that 
> your code is very slow if you don't use a pointer (that would be "a very 
> good reason to care"), you shouldn't optimize it. And if you notice, you 
> should open a bug against that package :) Though as established, you won't.
>
> On Sat, Jun 5, 2021 at 11:18 PM Ian Lance Taylor <ia...@golang.org> wrote:
>
>> On Sat, Jun 5, 2021 at 2:15 PM Joshua <joshua.o...@gmail.com> wrote:
>> >
>> > My question is general, but for ease of communicating I'll use the 
>> specific example I ran into.
>> >
>> > I'm very new and for my first project I'm working with the bleve 
>> library [https://pkg.go.dev/github.com/blevesearch/bleve].
>> >
>> > One function I need, "Open", returns an interface, "Index".
>> >
>> > I'd like to write my own function to act on this interface, and given 
>> that I have no idea what the dynamic value of the interface is, my first 
>> instinct is to rather pass a pointer to the returned interface into my 
>> function.
>> >
>> > However, I see lots of calls of "If you're using pointers to interfaces 
>> a lot, you probably don't understand them".
>> >
>> > Well, what am I not understanding?
>> > My worry is that I have no idea what dynamic type is lurking within the 
>> interface, if it's a pointer to a struct, then I obviously don't mind 
>> passing it into my function.
>> >
>> > However if it is in fact a humungous 1GB struct, then I really really 
>> don't want to be copying that around willy-nilly.
>> >
>> > Is there a way in general to avoid this, without looking at the library 
>> source code to see what the actual concrete type is?
>>
>> In the current implementations a value of interface type is always a
>> pair of pointers.  Even if the value of interface type happens to
>> refer to a 1GB struct, copying the interface value, including passing
>> it to a function or returning it from a function, always just copies
>> two pointers.
>>
>> Ian
>>
>> -- 
>> 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...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUuv_qrrG8%3DdCQZv0%2BrKbnbW60XdOCwjp8M3EdOCxCNkw%40mail.gmail.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/2fc297cf-0068-4547-8316-e0512169c91fn%40googlegroups.com.

Reply via email to