我正在学习Go (到目前为止),但我遇到了一个有趣的问题。无法编译的代码是:
package main
import "fmt"
type MyInt int
func (i MyInt) Double() MyInt {
return i + i
}
func AddTwo(i int) int {
return i + 2
}
func main() {
var a int = 3
var x MyInt = a // Why does this fail?
fmt.Println(x.Double())
var y int = AddTwo(x) // Why does this fail?
fmt.Println(y)
}以下是围棋游乐场链接:MyInt
当我尝试运行这个程序时,我会得到以下错误:
prog.go:17: cannot use a (type int) as type MyInt in assignment
prog.go:19: cannot use x (type MyInt) as type int in argument to AddTwo但是,如果我正确地阅读了规范,那么这段代码就应该编译。首先,MyInt的底层类型是int 根据这一节。事实上,给出的例子之一是type T1 string,它说T1的底层类型是string。那么,为什么我不能将a分配给x呢?他们不是有相同的潜在类型吗?对AddTwo()的函数调用也是如此。x的底层类型不是int吗?为什么我不能用它作为int参数呢?
另外,为什么Double()会编译呢?在表达式i + i中,我要添加两个MyInt值。它编译的事实表明,MyInt至少在某种意义上是一个int。
不管怎样,我有点困惑。因此,我认为像type MyInt int这样的声明的要点是,现在可以将方法添加到原始类型中。但是,如果您失去了将它们视为int (需要转换)的能力,那么拥有整个“底层类型”业务又有什么意义呢?
发布于 2015-10-28 21:47:30
Go有一个严格的类型系统。仅仅因为您的类型只是int的别名,并不意味着您可以自由地交换这两种类型,您仍然需要进行类型转换。下面是您的主要工作版本,下面是游乐场上的代码;https://play.golang.org/p/kdVY145lrJ
func main() {
var a int = 3
var x MyInt = MyInt(a) // Why does this fail?
fmt.Println(x.Double())
var y int = AddTwo(int(x)) // Why does this fail?
fmt.Println(y)
}https://stackoverflow.com/questions/33402126
复制相似问题