Go中的函数调用,赋值和“底层类型”

时间:2015-10-28 21:43:32

标签: go types

我正在学习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(需要施放)的能力,那么拥有这整个“基础类型”业务的重点是什么?

1 个答案:

答案 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)
}