Go:在结构上键入断言?

时间:2014-09-07 20:01:50

标签: go

package main

import "fmt"

type Number int

func (n *Number) IncreaseMe(i int) {
        *n += i
}

func main() {
        n := Number(10)

        n.IncreaseMe(90) // n is now supposed to be 100

        fmt.Println(n)
}

运行上面的代码时,它会给出错误消息

  

无效操作:* n + = i(不匹配的类型Number和int)

这是可以预期的,因为它试图对不共享相同类型的变量进行数学运算。

然后我尝试了

*n.(int) += i

告诉编译器不要担心因为* n可以被安全地视为整数,这导致我

invalid type assertion: n.(int) (non-interface type *Number on left)

我相信这种情况正在发生,因为类型断言仅适用于接口,而不适用于自定义类型。

那么解决方案是什么?

1 个答案:

答案 0 :(得分:5)

如" Go: Named type assertions and conversions"

中所述
  

类型断言仅适用于接口。接口可以有任意的底层类型,所以我们有类型断言和类型切换到救援。

您不需要类型断言:您可以:

  • *n转换为intint(*n)(因为您完全了解实际类型)。
  • 进行添加
  • 转换回Number

    *n = Number(int(*n) + i)
    

请参阅此play.golang.org:输出为100。


由于ruakh提及in the comments

  

去分裂"铸造"的概念分为两个独立的概念:

     
      
  • 一个("类型转换")用于编译器知道正确的转换,
  •   
  • 一个("类型断言")用于必须在运行时检查的转换。
  •   
     

后者仅适用于接口,因为只有接口在运行时具有在编译时才知道的其他类型信息。