为什么以下Go代码有效?
也就是说,由于f
和b
的类型为interface{}
(而不是bool
,int
或string
) ,我怎么可能在三个f
语句的每个语句中使用而不是转换或类型断言b
和if
?
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))
}
答案 0 :(得分:5)
与大多数Go语言问题一样,答案在Go Programming Language Specification,特别是Comparison Operators部分。
当X类型的值相当且X实现T时,非接口类型X的值x和接口类型T的值t是可比较的。如果t的动态类型与X相同,则它们是相等的。 t的动态值等于x。