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。