gpt4 book ai didi

go - Go 中的函数调用、赋值和 'underlying types'

转载 作者:IT王子 更新时间:2023-10-29 01:55:14 24 4
gpt4 key购买 nike

我正在学习 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(需要转换),那么拥有这整个“底层类型”业务的意义何在?

最佳答案

Go 有严格的类型系统。仅仅因为您的类型只是 int 的别名并不意味着您可以自由地互换两者,您仍然必须进行类型转换。下面是你的主要工作版本,这里是 Playground 上的代码; 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)
}

关于go - Go 中的函数调用、赋值和 'underlying types',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33402126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com