If I have:
type foo struct{
}
func bar(baz interface{}) {
}
The above are set in stone - I can\'t change foo or bar. Additionally,
To turn *foo
into an interface{}
is trivial:
f := &foo{}
bar(f) // every type implements interface{}. Nothing special required
In order to get back to a *foo
, you can either do a type assertion:
func bar(baz interface{}) {
f, ok := baz.(*foo)
if !ok {
// baz was not of type *foo. The assertion failed
}
// f is of type *foo
}
Or a type switch (similar, but useful if baz
can be multiple types):
func bar(baz interface{}) {
switch f := baz.(type) {
case *foo: // f is of type *foo
default: // f is some other type
}
}