Go:在结构上键入断言?

use*_*856 0 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

然后我试过了

*n.(int) += i
Run Code Online (Sandbox Code Playgroud)

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

invalid type assertion: n.(int) (non-interface type *Number on left)
Run Code Online (Sandbox Code Playgroud)

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

那么这个解决方案是什么?

Von*_*onC 5

如" Go:命名类型断言和转换 "中所述

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

你不需要类型断言:你可以只:

看到这个play.golang.org:输出是100.


正如鲁哈克在评论中提到的那样:

Go将"cast"的概念分为两​​个独立的概念:

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

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

  • +1.换句话说,Go将"强制转换"的概念分为两​​个独立的概念:一个("类型转换")用于编译器知道正确的转换,一个("类型断言")用于必须在运行时检查的转换.后者仅适用于接口,因为只有接口在运行时具有在编译时未知的其他类型信息. (4认同)