首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go中的函数调用、赋值和“基础类型”

Go中的函数调用、赋值和“基础类型”
EN

Stack Overflow用户
提问于 2015-10-28 21:43:31
回答 1查看 429关注 0票数 1

我正在学习Go (到目前为止),但我遇到了一个有趣的问题。无法编译的代码是:

代码语言:javascript
复制
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

当我尝试运行这个程序时,我会得到以下错误:

代码语言:javascript
复制
  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 (需要转换)的能力,那么拥有整个“底层类型”业务又有什么意义呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-28 21:47:30

Go有一个严格的类型系统。仅仅因为您的类型只是int的别名,并不意味着您可以自由地交换这两种类型,您仍然需要进行类型转换。下面是您的主要工作版本,下面是游乐场上的代码;https://play.golang.org/p/kdVY145lrJ

代码语言:javascript
复制
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)
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33402126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档