爲什麼第一個例子失敗了,但第二個順利呢?類型斷言和接口
做這種斷言的正確方法是什麼?
例1 https://play.golang.org/p/4LRGQLdGPB
// example 1
type Packet map[string]interface{}
func get(pack interface{}) {
if packet, ok := pack.(Packet); !ok {
fmt.Printf("error: %#v, %#v\n", pack, packet)
}
}
func main() {
pack := make(map[string]interface{})
pack["qwe"] = 123
get(pack)
}
// error: map[string]interface {}{"qwe":123}, main.Packet(nil)
例2 https://play.golang.org/p/Pd9jvvNrq5
// example 2
type Packet map[string]interface{}
func get(pack interface{}) {
var p Packet
if packet, ok := pack.(map[string]interface{}); !ok {
fmt.Printf("%#v, %#v\n", pack, packet)
} else {
p = packet
}
fmt.Printf("%#v\n", p)
}
func main() {
pack := make(map[string]interface{})
pack["qwe"] = 123
get(pack)
}
// main.Packet{"qwe":123}
也可以通過更換GET(包)來完成(包(包) ) – Apin
@Apin真的,但它真的毫無意義 – OneOfOne