【问题标题】:Go type assert nil to pointer type [duplicate]Go type assert nil to pointer type [重复]
【发布时间】:2015-11-19 23:09:51
【问题描述】:

为什么我不能将 nil 类型断言为指针类型?这背后的逻辑是什么?

package main

func main() {
    var s interface{} = nil
    var p *string = nil
    var q *string = s.(*string)
    _ = q
    _ = p
}

【问题讨论】:

    标签: go


    【解决方案1】:

    你不能在没有类型的情况下键入断言。

    变量的静态类型(或只是类型)是在它的 声明,新调用或复合文字中提供的类型, 或结构化变量的元素类型。 变量 接口类型也有一个独特的动态类型,即 在运行时分配给变量的值的具体类型 (除非该值是预先声明的标识符 nil,它没有 type)。 动态类型在执行过程中可能会发生变化,但值存储在 接口变量总是可以赋值给静态类型的 变量。

    直接来自spec(强调我的)

    接口知道底层值的类型。例如,如果我有一个带有type MyType 的接口,它也不能被断言为*string。你也许可以通过一些工作来转换它的类型,但是类型断言和类型转换是不同的。

    也可以看看here

    对于接口类型的表达式 x 和类型 T,主 表达

    x.(T)

    断言 x 不是 nil 并且存储在 x 中的值是 键入 T。符号 x.(T)

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2022-12-02
      • 2022-11-11
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多