【问题标题】:Type definition and interface conversion类型定义和接口转换
【发布时间】:2020-03-16 15:26:33
【问题描述】:

我已经尝试了以下代码:

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 {} is string, not main.T 的错误。 但是,如果我使用注释行,它会起作用。

Tstring 不是相同的底层类型吗?这背后的原因是什么?

【问题讨论】:

  • 是的,它们具有相同的底层类型,这就是 conversion (T(v)) 有效的原因,但是 type assertion (v.(T)) 是另一件事。
  • 添加到上面,断言是严格的。 stackoverflow.com/questions/41501596/…
  • 如果您是 Go 新手,则不需要 sync.Map。

标签: go interface


【解决方案1】:

这会在地图中存储string

a.Store("a", "A")

这会从映射中加载值,但返回一个指向上面插入的值的接口,即string

b, _ := a.Load("a")

这将检查b 是否为T

c = b.(T)

但是bstring,所以断言失败。

如果你这样做:

a.Store("a",T("A"))

那么断言应该可以工作,因为映射中值的类型现在是T

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2021-04-13
    • 2020-10-05
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多