I understand the difference, but that doesn't prevent me from having to choose between the two implementations. To simplify greatly, and as you pointed out in your reply, there is a tension between "simplicity" (non-generic) and "performance" (generic), and that is where I fear the friction will come from.
Looking beyond the syntax, the code for both implementations expresses exactly the same thing. So in a way it is the syntax that forces the choice to be made at the time the function is written. What I would like is not to have to make the choice at the time that I write the function, but perhaps this wish is impossible given the current Go syntax. Arnaud On Sunday, 27 December 2020 at 17:32:48 UTC k.alex...@gmail.com wrote: > Since in this case the use of generics doesn't let you do anything new, I > would argue that the KISS principle applies and the non-generic version > should be preferred. > > I think a linter can be added to go vet to warn about instances like this > one (where the type parameter can be replaced by the type bound) to > encourage simplicity. > > But as Ian pointed out, in the version that takes a slice argument, using > generics does allow you to do something you couldn't do otherwise (without > reallocating the contents of the slice to effect a "cast" to []Stringer). > In this case using generics actually makes the caller's job simpler and > improves performance by avoiding the need for reallocation. > > On Sun, Dec 27, 2020 at 4:23 AM Arnaud Delobelle <arn...@gmail.com> wrote: > >> In my opinion, the issue is that there are two ways to express (almost) >> the same thing and that in itself creates friction in the language. >> >> There may be a valid reason to choose one version over the other, but >> every time it will be necessary to review the pros and cons of each >> alternative. >> >> If we could have "generics" without having to make this choice it would >> unblock the whole thing as far as I am concerned. >> >> Cheers >> >> On Sun, 27 Dec 2020, 05:25 K. Alex Mills, <k.alex...@gmail.com> wrote: >> >>> 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 <z11...@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, <wi...@flibuste.net> wrote: >>>>> >>>>>> On 23-12-2020, Ian Lance Taylor wrote: >>>>>> > On Wed, Dec 23, 2020 at 9:54 AM wilk <wi...@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...@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...@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...@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 >>> >>> <https://groups.google.com/d/msgid/golang-nuts/CALJzkY-asEOYK1_zgVzNJ4B37u17QX0hZr5vZGADe-vEJgTtQA%40mail.gmail.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/859c14df-2dec-4e36-a4f0-7528bf17b8fen%40googlegroups.com.