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 <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 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://E9D6939F-CA80-4177-9684-9830AB5C65E0>> 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://E9D6939F-CA80-4177-9684-9830AB5C65E0>.
> 
>> 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/8896B61F-214B-473B-9C18-88A8E9B9B219%40ix.netcom.com.

Reply via email to