将Go接口{}直接比较为内置类型:为什么这样做?

时间:2016-07-07 17:18:02

标签: go types casting

为什么以下Go代码有效?

也就是说,由于fb的类型为interface{}(而不是boolintstring) ,我怎么可能在三个f语句的每个语句中使用而不是转换或类型断言bif

package main

import (
    "fmt"
    "reflect"
)

func foop(p map[string]interface{}) {
    p["foo"] = true
}

func barp(p map[string]interface{}) {
    p["bar"] = 17
}

func foop2(p map[string]interface{}) {
    p["foo"] = "blah"
}

func main() {
    p := make(map[string]interface{})
    fmt.Printf("%v\n", p)

    foop(p)
    barp(p)
    f := p["foo"]
    b := p["bar"]
    fmt.Printf("f: %T\n", f)
    if f == true {
        fmt.Println("ok")
    }
    fmt.Printf("b: %T\n", b)
    if b == 17 {
        fmt.Println("ok")
    }

    foop2(p)
    f = p["foo"]
    if f == "blah" {
        fmt.Println("ok")
    }
    fmt.Printf("f: %T\n", f)
    fmt.Printf("f: %s\n", reflect.TypeOf(f))
}

(去游乐场:https://play.golang.org/p/kPi25yW6tF

1 个答案:

答案 0 :(得分:5)

与大多数Go语言问题一样,答案在Go Programming Language Specification,特别是Comparison Operators部分。

  

当X类型的值相当且X实现T时,非接口类型X的值x和接口类型T的值t是可比较的。如果t的动态类型与X相同,则它们是相等的。 t的动态值等于x。