On Mar 5, 2018, at 10:32 PM, Ian Lance Taylor <i...@golang.org> wrote:
> 
> Go doesn't have anything like inheritance in C++.  What you are
> calling the "true underlying type" simply doesn't exist in Go.  Go has
> embedded fields, and methods of embedded fields are promoted to become
> methods of the outer type in which they are embedded.  But the outer
> type does not inherit anything from the inner type, at least not if
> you are using the word "inherit" in the sense that it is used in C++.
> The promoted methods are still methods on the inner type, they are
> just accessible directly from the outer type.
> 
> I think it's generally best to approach these problems in terms of how
> Go works, rather than trying to recreate C++ approaches in Go.  Go
> doesn't work the way that C++ does.
> 
> Ian

So why then does reflect.TypeOf(obj) return the “Outer” type in the example 
code I posted, here:

func ArgFun(in InType) {
        typ := reflect.TypeOf(in).Elem()
        fmt.Printf("ArgFun on in tells the truth: %v\n", typ.Name())
}

https://play.golang.org/p/KmihXxU19Dd

I don’t think json.Marshal etc would work without this behavior..

Per the discussion here: https://github.com/golang/go/issues/22013 — it seems 
like Go is rather unclear about exactly what level of C++-like inheritance it 
wants to support.  I don’t want to recreate any of that discussion here, but 
I’ll just add a tiny vote for at least keeping the notion of embedding as it is 
— don’t throw the baby out with the bathwater!  The presence of interfaces and 
the compositional model in Go is TONS better than C++’s rigid inheritance 
constraints, but sometimes a simple inherit-and-extend model is just the right 
thing, and it seems like it doesn’t add that much additional complexity to 
support it.  Maybe just need to add a bit of relevant docs in places to resolve 
residual confusions, such as the one I encountered.  Thanks for all your hard 
work on creating this awesome language!

- Randy



-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to