3.2 函数返回多个值的特性
在Go语言中,函数返回多个值的特性是一个重要的特性,可以让Go语言的程序代码更加简洁。学过C#或者Java语言的人都知道,在这两种语言中如果要让函数返回多个值,一般需要返回一个自定义的类或者借助其他手段。Go语言无须额外设置,即可根据需要返回多个值。
下面是Go语言函数返回多个值的示例程序3-3。
示例程序3-3 函数返回多个值:chapter03\code03\func03.go
在示例程序3-3中,第04行定义了一个sumAndmul函数,接受2个整数类型的参数;第05行用return返回a+b和a*b的结果,并用逗号隔开。由于返回的两个值的数据类型都为整数类型,因此第04行函数的返回值类型为(int, int) 。这里需要注意的是,函数返回多个值时,多个返回值的数据类型用逗号隔开,且必须放于括号()中,这个括号是不能省略的,否则会出现编译错误。
第08行用短变量声明的方式声明了两个变量s和m,同时调用函数sumAndmul(2, 3),由于此函数返回两个值2+3和2*3,因此会分别赋值给变量s和m,即变量s为5、m为6。第11行中有一个特殊的字符下划线(_),表示要忽略第二个返回值,因此变量s1的值为5。
在调用具有多个返回值的函数时,如果要将函数返回值赋值给变量,那么变量的个数和数据类型必须和函数返回值的个数和数据类型一致,否则会报错,例如s := sumAndmul(2, 3)和s, m, t :=sumAndmul(2, 3)都是错误的语法。在调用这类具有多个返回值的函数时也可以不赋值,如第15行所示,不过这种用法一般来说意义不大。
注意
Go函数不支持类似TypeScript语言中的可选参数和默认参数,这是Go语言的设计团队故意丢弃的语言特性。
如果我们用命令go build -gcflags "-l -m" func03.go进行逃逸分析,就会输出如下信息:
.\func03.go:12:12: main ... argument does not escape .\func03.go:12:13: s escapes to heap .\func03.go:12:13: m escapes to heap .\func03.go:15:12: main ... argument does not escape .\func03.go:15:13: s1 escapes to heap
由此可见,变量s、m和s1逃逸到堆(Heap)上了。