Saturday 16 December 2017

json - Create method for map[string]interface{} in Go

itemprop="text">

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 -> href="http://play.golang.org/p/kvw4dcZVNH"
rel="nofollow">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!



Answer




val =
val.(UnknownMapString)


This
is a type
assertion
, which supposes the rel="nofollow">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 href="http://golang.org/ref/spec#Assignability" rel="nofollow">can
assign a
map[string]interface{} to a
UnknownMapString because





x is assignable to a variable of type
T ("x is assignable to
T") when:




x's type V and
T have identical underlying types and at least one of
V or T 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.



href="http://play.golang.org/p/QyNRwtZPBa"
rel="nofollow">play.golang.org



Output:



test!


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...