【问题标题】:Golang func - return typeGolang func - 返回类型
【发布时间】:2016-11-17 06:42:53
【问题描述】:

这是我在“Hello world”之后的第一个Golang 程序。请找到以下旨在执行基本算术和多类型返回演示的代码块。这只是学习Go func 的假设样本。但是,我在编译时遇到了以下异常。从异常中,我假设,int8 操作数上的操作返回 int16/int32 作为返回类型,并且按照 go 是不正确的。

问题:假设int8 可以安全地分配给int16int32 是否安全

package main
import (
    "fmt"
)
func Arithmetic(a,b int8) (int8,string,int16,int32){
    return a-b, "add",a*b,a/b
}
func main() {
    a,b,c,d :=Arithmetic(5,10)
    fmt.Println(a,b,c,d)
}

错误:

C:/Go\bin\go.exe run C:/GoWorkspace/src/tlesource/ff.go
# command-line-arguments
.\ff.go:15: cannot use a * b (type int8) as type int16 in return argument
.\ff.go:15: cannot use a / b (type int8) as type int32 in return argument

Process finished with exit code 2

【问题讨论】:

  • 您不能将int8 分配给int16int32,但您可以安全地转换它们。
  • 你必须使用int16()等显式转换它
  • @JimB,感谢您的评论。我可能是错的,但是,安全分配和转换是不同的。
  • @ShmulikKlein,感谢您的评论。如果我们尝试向下转换,转换可能是有效的。但这是一个向上转换的情况。所以,我认为,对于没有任何帮助的编译器来说,这应该是一件容易的事。
  • @Nair:你到底在问什么?您不能将int8 分配给int16/int32/等。仅仅因为它是“安全的”并不意味着它们是可分配的;它们是不同的类型。 golang.org/ref/spec#Assignability

标签: go


【解决方案1】:

语言是否可以安全地假设 int8 可以安全地分配给 int16 或 int32

是的,如果 Go 在赋值时进行隐式转换,那就是这样。但它没有(仅在适用时进行接口包装)。

有几个原因:

  • 如果不引入类型层次结构的概念,则无法将自动转换的概念推广到所有类型。而且,如您所知,Go 中的所有具体类型都是不变的。
  • Go 是“反魔法”,本着这种精神,它不会做你没有要求它做的事情(除了指针上的写屏障)。

【讨论】:

    【解决方案2】:

    错误说你必须返回int16int32,你所要做的就是像这样转换结果:

    func Arithmetic(a, b int8) (int8, string, int16, int32) {
        return a - b, "add", int16(a * b), int32(a / b)
    }
    

    【讨论】:

    • 感谢您的支持。我的问题不是如何修复错误消息。相反,我很想知道为什么 Go 不能进行安全转换
    • @Nair 为什么无法进行安全转换? “因为这就是语言的定义方式”。
    • 你可能最好使用int16(a) * int16(b) 而不是int16(a * b)...除非你能保证a * b 不会换行。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多