On Thu, 29 Sep 2016 00:25:23 -0700 (PDT)
T L <[email protected]> wrote:
> > > I just want to understand what is the deep reason for the syntax
> > > inconsistency between map index and type assert.
> >
> > a map is fully typed at compile time. even if its key is of type
> > interface{} the language defines how to compare two interface{}
> > values using type assertion here:
> > https://golang.org/ref/spec#Comparison_operators
> >
> > "Interface values are comparable. Two interface values are equal if
> > they have identical dynamic types and equal dynamic values or if
> > both have value nil."
> >
> > Using interface{} in assignments on the other hand is only
> > type-safe at runtime when used with a type assertion.
> >
>
> Aha, it would be more understandable if you can explain it with code.
> :), my English is not very good.
"One argument lookup" of a map containing values of type interface{}
produces the zero value for type interface{}. That's because as Andrey
said, such map _itself_ is statically typed: the type of its values is
interface{}.
Conversely, when you type-assert a value of type interface{}, you're
making a claim the _real dynamic run-time_ type of the value held in
that value of type interface{} is such and such.
Thus even though both operations superficially look the same, they're
doing drastically different things, as Andrey and Dave tried to explain.
Here's the code:
package main
import (
"fmt"
)
func main() {
var zvi interface{} // The zero value for type interface{}
m := make(map[string]interface{})
v := m["abc"] // Returns the zero value for type interface{}
fmt.Println(v == zvi) // Prints "true"
v = zvi.(int64) // panics beause zvi contains no dynamic type
// information.
}
Playground link: https://play.golang.org/p/oS7SWHXgJQ
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.