Sorry, the code works as expected - as I thinking of something else. > On Jan 1, 2021, at 3:49 PM, robert engels <reng...@ix.netcom.com> wrote: > > But this/your code is not really using generics - it is using interfaces. The > only type check is that the instances implement fmt.Stringer - this is very > different than the previous version. > >> On Jan 1, 2021, at 2:51 PM, da...@suarezhouse.net <http://suarezhouse.net/> >> <da...@suarezhouse.net <mailto:da...@suarezhouse.net>> wrote: >> >> Wow, you are awesome! I think this shows that generics "can be" fully >> hidden from view of typical users if desired. In other words, the typical >> user wouldn't need to know they exist whereas more advanced users can >> leverage to minimize code duplication. My question is: should that be a >> goal or is it a non-goal? >> >> I see what you are saying in terms of might be less readable but if I put >> myself in the shoes of someone that has never seen anything about generics >> and this example works (which it does), potentially stating it as a goal >> would alleviate concerns on losing simplicity? e.g. the library writer can >> always make the effort to hide the usage of generics if the intended >> audience is the general public vs. internal code while the internal code >> would still have the same compile time checks, reduction of duplication, etc. >> >> Thoughts? >> >> Thanks again! >> David >> On Friday, January 1, 2021 at 2:21:15 PM UTC-6 ren...@ix.netcom.com >> <http://ix.netcom.com/> wrote: >> I think the first version is far more understandable. You are declaring the >> Table and the types for each column - passing the type rather than instances >> of the type. >> >> But here is the corrected code https://go2goplay.golang.org/p/VMFOcI91i4X >> <https://go2goplay.golang.org/p/VMFOcI91i4X> >> >> >>> On Jan 1, 2021, at 1:56 PM, da...@suarezhouse.net <http://suarezhouse.net/> >>> <da...@suarezhouse.net >>> <applewebdata://4F94DAA5-329D-4524-8B14-3F201C205EA4>> wrote: >>> >> >>> I am wondering if this is also something easy for the more experienced >>> folks here. >>> >>> I took the example from Rog: https://go2goplay.golang.org/p/ZUAVncRrmZW >>> <https://go2goplay.golang.org/p/ZUAVncRrmZW> >>> >>> and tried to further "hide" the generics implementation on the library side >>> by shifting the type instantiation into a function. Only line 45 is the >>> change here (previous line commented right above it for ref + in the >>> library side the additional New function): >>> New link with the changes here: https://go2goplay.golang.org/p/mnc8yjaREwo >>> <https://go2goplay.golang.org/p/mnc8yjaREwo> >>> >>> It feels functionally equivalent but I am getting an error in line 57 which >>> has a generic attempt of the previous user side instantiation. Is this >>> possible in a slightly different way? >>> >>> Thanks again! >>> David >>> On Friday, January 1, 2021 at 11:50:15 AM UTC-6 Brian Candler wrote: >>> If by "generics doc" you mean this one >>> <https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md>, >>> then note: >>> >>> "Generic types can have methods. The receiver type of a method must declare >>> the same number of type parameters as are declared in the receiver type's >>> definition. They are declared without any constraint." >>> >>> That is, you can't define a method on plain Table, but you can define a >>> method on Table[T1, T2, T3] >>> >>> Without actually looking further into what your code is doing, that implies >>> the following change: >>> >>> func (t *Table[T1, T2, T3]) Add (a, b, c interface{}){ >>> row := Row {colA: a, colB: b, colC: c} >>> append(t.rows, row) >>> } >>> >>> However that's also not right, because you're ignoring the return value >>> from append (for more info read the blog posting on slices >>> <https://blog.golang.org/slices>). So: >>> >>> func (t *Table[T1, T2, T3]) Add (a, b, c interface{}){ >>> row := Row {colA: a, colB: b, colC: c} >>> t.rows := append(t.rows, row) >>> } >>> >>> The next problem is here: >>> >>> func (t *Table[T1, T2, T3]) Print (){ >>> fmt.Println("table format is: %v, %v, %v", >>> reflect.TypeOf(t.colATemplate), reflect.TypeOf(t.colBTemplate), >>> reflect.TypeOf(t.colCTemplate)) >>> for row := range t.rows { >>> fmt.Println("%v, %v, %v", row.colA, row.colB, row.colC) >>> } >>> } >>> >>> prog.go2:72:33: row.colA undefined (type int has no field or method colA) >>> prog.go2:72:43: row.colB undefined (type int has no field or method colB) >>> prog.go2:72:53: row.colC undefined (type int has no field or method colC) >>> >>> Iterating over a slice with just one receiver variable gives you only the >>> index. This needs to be: >>> >>> func (t *Table[T1, T2, T3]) Print (){ >>> fmt.Println("table format is: %v, %v, %v", >>> reflect.TypeOf(t.colATemplate), reflect.TypeOf(t.colBTemplate), >>> reflect.TypeOf(t.colCTemplate)) >>> for _, row := range t.rows { >>> fmt.Println("%v, %v, %v", row.colA, row.colB, row.colC) >>> } >>> } >>> >>> This then breaks because t.rows is a slice of interface{}, not a slice of >>> Row. So I changed it to []Row. Then fixing your Println's to Printf's, >>> this gives https://go2goplay.golang.org/p/dAnPU_r0DpM >>> <https://go2goplay.golang.org/p/dAnPU_r0DpM> and now it runs. >>> >>> However, I think this still needs work. There should be no need for >>> interface{} in Row; you should use generics for this too, and then your >>> Table just needs to be a slice of Row[T1, T2, T3] >>> >>> On Friday, 1 January 2021 at 15:06:15 UTC da...@suarezhouse.net <> wrote: >>> I thought I read the generics doc well but.. :-) Help is appreciated: >>> >>> I instantiate a generic table example here in line 41: >>> https://go2goplay.golang.org/p/SadxA0khqx7 >>> <https://go2goplay.golang.org/p/SadxA0khqx7> >>> >>> Then I use it in lines 42 and 43. >>> >>> The errors I get are below: >>> prog.go2:67:10: cannot use generic type Table[colA, colB, colC >>> fmt.Stringer] without instantiation >>> prog.go2:72:10: cannot use generic type Table[colA, colB, colC >>> fmt.Stringer] without instantiation >>> >>> I am using the same table. The method belongs to the struct so I would >>> think should be considered instantiated and that I wouldn't have to repeat >>> in lines 42 and 43 the types. >>> >>> Is this a bug and it should infer since created in line 41 or what did I >>> misunderstand in the doc? >>> >>> Thanks in advance for the help! >>> David >>> >> >>> -- >>> 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 >>> <applewebdata://4F94DAA5-329D-4524-8B14-3F201C205EA4>. >> >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/09931d6e-c5e0-4d38-844b-2c3e07d03565n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/09931d6e-c5e0-4d38-844b-2c3e07d03565n%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 >> <mailto:golang-nuts+unsubscr...@googlegroups.com>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/e79f54da-c3d9-468f-84f1-b0194d569b31n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/e79f54da-c3d9-468f-84f1-b0194d569b31n%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/BA3A987D-8B5A-401F-B3AE-05C09D42DCCB%40ix.netcom.com.