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

> On Jan 1, 2021, at 1:56 PM, da...@suarezhouse.net <da...@suarezhouse.net> 
> 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
> 
> 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 
> <applewebdata://E7FE4EC0-8348-4FF3-8242-53C3065A0451> 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+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/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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/41B009DD-6870-4B84-A216-A024F8D48254%40ix.netcom.com.

Reply via email to