While it depends on the final generics implementation, my understanding of
how things stand now is that Print would compile down to a separate chunk
of binary for each type T that is used. For instance, if you used Print[A]
and Print[B] in your code, they would each refer to separate binary
implementations in which T is replaced by A and B, respectively.

Printi does not do this, so you should see a smaller binary.

IIRC, Printi also has to do a bit of work to lookup the Stringer method on
the type inhabiting the interface. I don't think that creates a significant
performance hit, but I might be understating the overhead of interface
dispatch. A benchmark would help here (alas, I am on my phone).

With respect for the concerns mentioned above, I don't see an argument for
preferring Print over Printi. However, there may other concerns which I am
unaware of.

On Sat, Dec 26, 2020, 9:58 PM Elliot <z11i...@gmail.com> wrote:

> If we remove slice from OP's example:
>
> https://go2goplay.golang.org/p/KSJpRw1Lrmm
>
> func Print[T Stringer](s T) {
>     fmt.Print(s.String())
> }
>
> func Printi(s Stringer) {
>     fmt.Print(s.String())
> }
>
> Are these two equivalent? When should one be chosen over the other?
>
> On Thursday, 24 December 2020 at 04:41:16 UTC+8 Henrik Johansson wrote:
>
>> Why will interfaces be more idiomatic once generics lands? It remains to
>> be seen I guess but I could very well see the other way become the idiom.
>>
>> On Wed, 23 Dec 2020, 21:20 wilk, <w...@flibuste.net> wrote:
>>
>>> On 23-12-2020, Ian Lance Taylor wrote:
>>> > On Wed, Dec 23, 2020 at 9:54 AM wilk <w...@flibuste.net> wrote:
>>> >>
>>> >> https://go2goplay.golang.org/p/fTW3hJYNgfU
>>> >>
>>> >> type Stringer interface {
>>> >>    String() string
>>> >> }
>>> >>
>>> >> Print[T Stringer](s []T)
>>> >>
>>> >> Print(s []Stringer)
>>> >>
>>> >> Both forms works.
>>> >> How to prevent double way to do the same things that can be confusing
>>> ?
>>> >
>>> > Both forms work but they mean two different things.
>>> >
>>> > Print(s []Stringer) takes a slice of the type Stringer.
>>> >
>>> > Print[T Stringer](s []T) takes a slice of some type T, where T
>>> > implements Stringer.
>>> >
>>> > For example, if MyInt implements Stringer, and I have a []MyInt, then
>>> > I can call Print[T Stringer](s []T) but I can't call Print(s
>>> > []Stringer), because a []Stringer is not a []MyInt.
>>>
>>> I understand the differences. But i'm affraid someone who never used
>>> Go before will use type parameters instead of interface which is more
>>> idiomatic i think.
>>> I mean it will be difficult to say, you could use type parameters but
>>> you should use interface, or something like that...
>>> I'm speaking about ease of learn Go2.
>>>
>>> --
>>> wilk
>>>
>>> --
>>> 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/rs08pp%24p8m%241%40ciao.gmane.io
>>> .
>>>
>> --
> 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/d044ae30-7254-4a86-9cba-1bc18eeb7fefn%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/d044ae30-7254-4a86-9cba-1bc18eeb7fefn%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/CALJzkY-asEOYK1_zgVzNJ4B37u17QX0hZr5vZGADe-vEJgTtQA%40mail.gmail.com.

Reply via email to