Golang func-返回类型

Golang func-返回类型,go,Go,这是我继“你好世界”之后的第一个Golang节目。请查找以下代码块,该代码块旨在执行基本算术和多类型返回演示。这只是学习Go func的一个假设示例。然而,我在编译时遇到了以下异常。根据异常情况,我假设,int8操作数上的操作返回int16/int32作为返回类型,并且根据go,返回类型不正确 问题:语言假设int8可以安全地分配给int16或int32 package main import ( "fmt" ) func Arithmetic(a,b int8) (int8,strin

这是我继“你好世界”之后的第一个
Golang
节目。请查找以下代码块,该代码块旨在执行基本算术和多类型返回演示。这只是学习
Go func
的一个假设示例。然而,我在编译时遇到了以下异常。根据异常情况,我假设,
int8
操作数上的操作返回
int16/int32
作为返回类型,并且根据go,返回类型不正确

问题:语言假设
int8
可以安全地分配给
int16
int32

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

错误表示您必须返回int16int32,您所要做的就是如下转换结果:

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

错误表示您必须返回int16int32,您所要做的就是如下转换结果:

func Arithmetic(a, b int8) (int8, string, int16, int32) {
    return a - b, "add", int16(a * b), int32(a / b)
}
假设int8可以安全地分配给int16或int32,这种语言安全吗

是的,如果Go在赋值时进行隐式转换的话。但事实并非如此(仅适用于接口包装)

有几个原因:

  • 如果不引入类型层次结构的概念,自动转换的概念就不能推广到所有类型。正如你所知,Go中的所有具体类型都是不变的
  • 围棋是“反魔法”的,本着这种精神,它不会做你没有要求它做的事情(除了在指针上写下障碍)
假设int8可以安全地分配给int16或int32,这种语言安全吗

是的,如果Go在赋值时进行隐式转换的话。但事实并非如此(仅适用于接口包装)

有几个原因:

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

不能将
int8
分配给
int16
int32
,但可以安全地转换它们。必须使用
int16()
显式强制转换,etc@JimB,谢谢你的评论。我可能错了,但是,安全分配和转换是不同的。@ShmulikKlein,谢谢你的评论。如果我们尝试向下投射,则投射可能是有效的。但这是一个向上投射的例子。所以,我想,对于编译器来说,这应该是一项不需要任何帮助的简单任务。@Nair:你到底在问什么?不能将
int8
分配给
int16
/
int32
/等。仅仅因为它是“安全的”,并不意味着它们是可分配的;它们是不同的类型。不能将
int8
分配给
int16
int32
,但可以安全地转换它们。必须使用
int16()
显式强制转换,etc@JimB,谢谢你的评论。我可能错了,但是,安全分配和转换是不同的。@ShmulikKlein,谢谢你的评论。如果我们尝试向下投射,则投射可能是有效的。但这是一个向上投射的例子。所以,我想,对于编译器来说,这应该是一项不需要任何帮助的简单任务。@Nair:你到底在问什么?不能将
int8
分配给
int16
/
int32
/等。仅仅因为它是“安全的”,并不意味着它们是可分配的;它们是不同的类型。谢谢你的支持。我的问题不是如何修复错误消息。相反,我想知道为什么Go不能保证安全conversion@Nair为什么不能进行安全转换?“因为这就是语言的定义”。你最好做
int16(a)*int16(b)
,而不是
int16(a*b)
。。。除非你能保证
a*b
不会包装,谢谢你的支持。我的问题不是如何修复错误消息。相反,我想知道为什么Go不能保证安全conversion@Nair为什么不能进行安全转换?“因为这就是语言的定义”。你最好做
int16(a)*int16(b)
,而不是
int16(a*b)
。。。除非你能保证
a*b
不会包装,也就是说。