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)
我相信这种情况正在发生,因为类型断言仅适用于接口,而不适用于自定义类型。
那么解决方案是什么?
答案 0 :(得分:5)
如" Go: Named type assertions and conversions"
中所述类型断言仅适用于接口。接口可以有任意的底层类型,所以我们有类型断言和类型切换到救援。
您不需要类型断言:您可以:
*n
转换为int
:int(*n)
(因为您完全了解实际类型)。转换回Number
*n = Number(int(*n) + i)
请参阅此play.golang.org:输出为100。
由于ruakh提及in the comments:
去分裂"铸造"的概念分为两个独立的概念:
- 一个("类型转换")用于编译器知道正确的转换,
- 一个("类型断言")用于必须在运行时检查的转换。
后者仅适用于接口,因为只有接口在运行时具有在编译时才知道的其他类型信息。