Go 类型转换和类型断言之间有什么区别?

Go 类型转换和类型断言之间有什么区别?,go,Go,以下各项之间的主要区别是什么: v=t.(aType)//类型断言 v=aType(t)//类型转换 我应该在哪里使用类型断言或类型转换?类型断言断言t(接口类型)实际上是aType,而t将是aType;即包装在t界面中的一个。例如,如果您知道您的var-reader io.reader实际上是一个*字节.Buffer,您可以执行var-br*bytes.Buffer=读取器。(*bytes.Buffer) 类型转换将一种(非接口)类型转换为另一种类型,例如Avar x uint8to和int6

以下各项之间的主要区别是什么:

  • v=t.(aType)//类型断言
  • v=aType(t)//类型转换

  • 我应该在哪里使用类型断言或类型转换?

    类型断言断言
    t
    (接口类型)实际上是
    aType
    ,而
    t
    将是
    aType
    ;即包装在
    t
    界面中的一个。例如,如果您知道您的
    var-reader io.reader
    实际上是一个
    *字节.Buffer
    ,您可以执行
    var-br*bytes.Buffer=读取器。(*bytes.Buffer)

    类型转换将一种(非接口)类型转换为另一种类型,例如A
    var x uint8
    to和int64 like
    var id int64=int64(x)


    经验法则:如果您必须将具体类型包装到接口中,并希望返回具体类型,请使用类型断言(或类型开关)。如果您需要将一种具体类型转换为另一种类型,请使用类型转换。

    “t将是一种aType”-您能详细说明一下吗<代码>t没有修改吗?@nemo我想他会说
    v
    ,不是
    t
    。@LucianoQ:不,是
    t
    不是
    v
    @nemo:No
    t
    不会被类型断言或类型转换修改。我强烈推荐Go之旅和之后的语言规范。@Volker谢谢你的推荐,这是一次很好的演讲!然而,我仍然认为你的意思是
    v
    ,而不是
    t
    t
    在这种情况下将是某种接口类型,例如
    interface{}
    ,在
    t
    上断言后,结果值
    v
    将是
    aType
    @nemo类型。不,我的意思是t的动态类型是aType。v的类型是无趣的。也有点离题,但值得注意的是,强制转换通常意味着某种运行时支持,但断言纯粹是一种编译时构造,是一种提供编译器提示的方法,说明您希望如何分析代码。