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/9e491c38-2d27-4ec7-bbe1-4a3ae36359fbn%40googlegroups.com.

Reply via email to