On Thu, 29 Sep 2016 00:25:23 -0700 (PDT)
T L <tapir....@gmail.com> 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 golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to