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.