我正在学习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)
}
以下是Go Playground链接: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
according to this section。实际上,给出的一个例子是type T1 string
,它说T1
的基础类型是string
。那么为什么我不能将a
分配给x
?他们没有相同的基础类型吗?对AddTwo()
的函数调用也是如此。 x
是否具有基础类型int
?为什么我不能将它用作int
参数?
另外,Double()
怎么编译呢?在表达式i + i
中,我添加了两个MyInt
值。它编译的事实表明MyInt
至少在某种意义上是int
。
无论如何,我有点困惑。所以我认为像type MyInt int
这样的声明就是现在你可以向基本类型添加方法了。但如果你失去了将它们视为int
(需要施放)的能力,那么拥有这整个“基础类型”业务的重点是什么?
答案 0 :(得分:4)
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)
}