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)
我相信这种情况正在发生,因为类型断言仅适用于接口,而不适用于自定义类型.
那么这个解决方案是什么?
如" Go:命名类型断言和转换 "中所述
类型断言仅适用于接口.接口可以有任意的底层类型,所以我们有类型断言和类型切换到救援.
你不需要类型断言:你可以只:
*n为int:( int(*n)因为你完全了解实际类型).转换回来 Number
*n = Number(int(*n) + i)
Run Code Online (Sandbox Code Playgroud)看到这个play.golang.org:输出是100.
Go将"cast"的概念分为两个独立的概念:
- 一个("类型转换")用于编译器知道正确的转换,以及
- 一个("类型断言")用于必须在运行时检查的转换.
后者仅适用于接口,因为只有接口在运行时具有在编译时未知的其他类型信息.
| 归档时间: |
|
| 查看次数: |
951 次 |
| 最近记录: |