On Thu, Oct 18, 2018 at 9:37 AM robert engels <[email protected]> wrote:
>
> That is true, it would be done that way, so not an issue. Sorry for the
> tangent.
>
> I still don’t understand when ‘like T’ when T is a concrete type. It seems
> daunting, unless you use the containment as outlined previously - but a X
> containing T, is far different than X being a T, and I am not sure the
> semantics of the function will hold.
>
> Imagine a
>
> type Node struct {
> link *Node
> }
>
> then you have a linked list
>
> type LinkedList struct {
> head *node
> }
>
> with
>
> func (LinkedList *) Add(n like Node){ blah..}
>
> passing a
>
> struct MyNode {
> Node
> value int
> }
>
> will not work, because the reference passed to Add() points to inner instance.
In this example, neither LinkedList nor Node are templates, but Add is
a template. Let's try to write the Add function.
func (l *LinkedList) Add(n type *T like(Node)) {
if l.head==nil {
l.head=n
n.link=nil
return
}
tail:=l.head
for tail.link!=nil {
tail=tail.link
}
n.link=nil
tail.link=n
}
This should compile for:
l.Add(&MyNode{value:1})
if private values of MyNode is accessible where it is used. That means
the following won't work:
package A
struct MyNode {private fields}
package B
l.Add(&A.MyNode{})
However, if private fields of MyNode is accessible where Add() is
instantiated, Add should compile without any errors.
>
> you would need to create:
>
> struct MyNode {
> Link *Node
> value int
> }
>
> and make link exported - meaning you need to understand the internal details
> of LinkedList in order to use it.
>
> At least I think so… :)
>
>
>
>
>
>
> > On Oct 18, 2018, at 10:03 AM, Burak Serdar <[email protected]> wrote:
> >
> > On Thu, Oct 18, 2018 at 8:53 AM Robert Engels <[email protected]> wrote:
> >>
> >>
> >>
> >>> On Oct 18, 2018, at 9:41 AM, Burak Serdar <[email protected]> wrote:
> >>>
> >>> If X is a struct type, any type implementing all the methods of X and
> >>> containing all the fields of X can be substituted
> >>
> >> The above is the problem. This almost certainly requires dynamic access to
> >> fields, essentially making all method and field access dynamic, and I
> >> don’t think the Go performance hounds will go for it. I am
> >
> > I don't understand this concern either.
> >
> > func F(in like T)
> >
> > is a template. When the compiler instantiates F with a concrete type
> > T, a new copy of F is compiled using that type. There is no dynamic
> > access involved there, everything is statically resolved.
> >
> > not even certain it can be done without runtime reflection.
> >>
> >> But still a developer having to create a Bar with all of the exported
> >> methods and fields of Foo seems daunting.
> >
> > --
> > 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 [email protected].
> > For more options, visit https://groups.google.com/d/optout.
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.