Golang func - 返回类型

时间:2016-10-25 22:00:30

标签: go

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

问题:语言假定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

2 个答案:

答案 0 :(得分:3)

  

语言是否安全,假设int8可安全地赋值给int16或int32

是的,如果Go在转让时做了隐含的转换,那就是。但它没有(只适用于界面包装)。

有几个原因:

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

答案 1 :(得分:2)

错误说您必须返回 int16 int32 ,您只需将结果转换为:

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