Go 类型定义和接口转换
我已试用了以下代码:Go 类型定义和接口转换,go,interface,Go,Interface,我已试用了以下代码: package main import ( "fmt" "sync" ) type T string func main() { var a sync.Map // map[interface{}]interface{} var c T // a.Store("a", T("A")) a.Store("a", "A") b, _ := a.Load("a") c = b.(T) fmt.Print
package main
import (
"fmt"
"sync"
)
type T string
func main() {
var a sync.Map // map[interface{}]interface{}
var c T
// a.Store("a", T("A"))
a.Store("a", "A")
b, _ := a.Load("a")
c = b.(T)
fmt.Println(c)
}
这会得到一个错误panic:interface conversion:interface{}是string,而不是main.T
。
但是,如果我使用注释行,它就可以工作
t
和string
不是相同的底层类型吗?这背后是什么?这在地图中存储了一个字符串:
a.Store("a", "A")
这将从映射加载值,但返回一个指向上面插入的值的接口,该值是一个字符串
:
b, _ := a.Load("a")
这将检查b
是否为T
:
c = b.(T)
但是b
是一个字符串,因此断言失败
如果您这样做:
a.Store("a",T("A"))
然后断言应该可以工作,因为映射中的值的类型现在是T
是的,它们具有相同的底层类型,这就是为什么转换(T(v)
)可以工作,但是类型断言(v.(T)
)是另一回事。除此之外,断言是严格的。如果您是新手,则不需要sync.Map。