函数
Golang支持多返回值,但是有些语言,例如C语言不支持多返回值。
函数返回单值
代码:
package main
import "fmt"
func foo1(a string, b int) int {
fmt.Println("a = ", a)
fmt.Println("b = ", b)
c := 100
return c
}
func main() {
c := foo1("abc", 1)
fmt.Println("c = ", c)
}
第5行声明一个函数
foo1
- 6、7两行打印a,b两个传递过来的形参的值
- 第9行新建函数体内的变量c赋值100
- 第10行返回函数体内的c的值
- 第14行调用函数
foo1
并将运算结果赋值给变量c - 打印变量c
函数返回多值(匿名返回值)
函数返回多值案例:
package main
import "fmt"
func foo2(a string, b int) (int, int){
fmt.Println("a = ", a)
fmt.Println("b = ", b)
return 666, 777
}
func main() {
ret1, ret2 := foo2("haha", 34)
fmt.Println("ret1 = ", ret1)
fmt.Println("ret2 = ", ret2)
}
第5行声明函数
foo2
- foo2打印两个传递过来的形参
- 返回两个int型值
- 12-16行主函数内首先调用函数
foo2
然后将返回的两个值赋值给ret1,ret2,之后打印ret1,ret2 - 注意:这里的返回值都是匿名的,在最后都是重新将返回值赋值给变量再打印出来
运行结果:
成功将函数返回的值打印出来
函数返回多值(返回值有命名)
在设置返回值数量时同样可以给返回值命名,然后在函数体中直接对传出的参数名进行赋值即可。
package main
import "fmt"
// 返回多个返回值,有形参名称的
func foo3(a string, b int) (r1 int, r2 int){ // 返回值命名为r1和r2
fmt.Println("---foo3---")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
// 给有名称的返回值变量赋值
r1 = 123
r2 = 456
return
}
func main() {
ret1, ret2 := foo3("zxc", 90)
fmt.Println("ret1 = ",ret1)
fmt.Println("ret2 = ",ret2)
}
函数返回多值(返回值数据类型相同时简写)
当返回值的数据类型相同时可以只保留一个数据类型即可:
package main
import "fmt"
func foo4(a string, b int) (r1 , r2 int){ // 返回值数据类型相同时只保留一种数据类型即可
fmt.Println("---foo4---")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
// 给有名称的返回值变量赋值
r1 = 778
r2 = 445
return
}
func main() {
ret1, ret2 := foo4("sdf", 909)
fmt.Println("ret1 = ",ret1)
fmt.Println("ret2 = ",ret2)
}
运行结果:
函数注意点
有名称的返回值在函数体内需要赋值
函数中有名称的返回值需要在函数中对名称进行赋值:
- 就像下方的函数中的7、8行那样:
func foo3(a string, b int) (r1 int, r2 int){ // 返回值命名为r1和r2 fmt.Println("---foo3---") fmt.Println("a = ", a) fmt.Println("b = ", b) // 给有名称的返回值变量赋值 r1 = 123 r2 = 456 return }
- 当然直接在return后面直接写返回的值也可以:
func foo3(a string, b int) (r1 int, r2 int){ // 返回值命名为r1和r2 fmt.Println("---foo3---") fmt.Println("a = ", a) fmt.Println("b = ", b) return 123, 456 }
有名称的返回值本质上是函数内的形参
有名称的返回值本质上是函数内的形参,如果没有对返回值赋值,那么初始化默认的值为0
func foo4(a string, b int) (r1 , r2 int){ // 返回值数据类型相同时只保留一种数据类型即可 fmt.Println("---foo4---") fmt.Println("a = ", a) fmt.Println("b = ", b) // 属于foo4的形参,初始化默认为0 // r1,r2的作用域为foo4整个函数体的{}内部 fmt.Println("r1 = ", r1) fmt.Println("r2 = ", r2) // 给有名称的返回值变量赋值 r1 = 778 r2 = 445 return } func main() { ret1, ret2 := foo4("sdf", 909) fmt.Println("ret1 = ",ret1) fmt.Println("ret2 = ",ret2) }
运行结果:
可以看到没有对返回值赋值打印出来的都是初始化值0
此处评论已关闭