Is there a way to cast interface to embedded type?

130 views
Skip to first unread message

Christopher C

unread,
Feb 9, 2024, 3:37:13 PMFeb 9
to golang-nuts
I have a base struct that implements an interface. There are multiple other structs that embed this base struct.  I would like to pass the an interface into a function that can cast it as the base struct and call some functions tied to the base struct.
 
Something like this...

burak serdar

unread,
Feb 9, 2024, 3:45:15 PMFeb 9
to Christopher C, golang-nuts
On Fri, Feb 9, 2024 at 1:37 PM Christopher C
<crotty.ch...@gmail.com> wrote:
>
> I have a base struct that implements an interface. There are multiple other structs that embed this base struct. I would like to pass the an interface into a function that can cast it as the base struct and call some functions tied to the base struct.

No, because type assertion tests the type of the object contained in
an interface, and that object is not the base object.

However, you can put whatever functions you are planning to call in
that base object into another interface, and call that:

type Base struct {...}

func (Base) A() {}
func (Base) B() {}

type HasA interface {
A()
}

func f(in HasA) {
type hasB interface {
B()
}
b,ok:=in.(hasB)
if ok {
b.B()
}
}




>
> Something like this...
> https://go.dev/play/p/DUzXr31s8Pn
>
> --
> 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.
> To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/1ded992c-3f90-4c30-99a5-532e573cf16fn%40googlegroups.com.

Mike Schinkel

unread,
Feb 9, 2024, 4:35:31 PMFeb 9
to Christopher C, GoLang Nuts Mailing List
You can't cast like in your example, but you can create an interface — call is `Baser` using idiomatic interface naming to identify the `Base` type which will have an empty `Base()` method — and then type assert to it after which, if it succeeds you can type assert to `*Base`, like so:


Hope this helps.

-Mike

Christopher C

unread,
Feb 12, 2024, 3:58:03 PMFeb 12
to golang-nuts
Thanks to both of you. I'll try out your suggestions.
Reply all
Reply to author
Forward
0 new messages