Reputation: 786
I have defined a Type
type UnknownMapString map[string]interface{}
I also have methods for them like so
func (m UnknownMapString) Foo() {
fmt.Println("test!")
}
I get a panic when running:
interface conversion: interface is map[string]interface {}, not main.UnknownMapString
The map[string]interface{} is unmarshaled from JSON input.
Playground replicating it -> http://play.golang.org/p/kvw4dcZVNH
I thought that you could not have interface as a receiver of method so we needed to type assert (not convert?) to a Named Type and use that Named Type as the receiver of the method. Please let me know what I'm doing wrong. Thanks!
Upvotes: 2
Views: 2648
Reputation: 1324657
val = val.(UnknownMapString)
This is a type assertion, which supposes the named type UnknownMapString
is identical to the unnamed type map[string]interface{}
.
And type identity tells us that:
A named and an unnamed type are always different.
But: you can assign a map[string]interface{}
to a UnknownMapString
because
x
is assignable to a variable of typeT
("x
is assignable toT
") when:
x
's typeV
andT
have identical underlying types and at least one ofV
orT
is not a named type.
This would work:
var val2 UnknownMapString = val.(map[string]interface{})
val2.Foo()
val2
is not an unnamed type, and both val2
and val.(map[string]interface{})
underlying types are identical.
Output:
test!
Upvotes: 5