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 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 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 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 >> >> 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+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/09931d6e-c5e0-4d38-844b-2c3e07d03565n%40googlegroups.com.