函数

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

运行结果:
image.png

函数返回多值(匿名返回值)

函数返回多值案例:

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
  • 注意:这里的返回值都是匿名的,在最后都是重新将返回值赋值给变量再打印出来

运行结果:
image.png
成功将函数返回的值打印出来

函数返回多值(返回值有命名)

在设置返回值数量时同样可以给返回值命名,然后在函数体中直接对传出的参数名进行赋值即可。

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)
}

运行结果:
image.png

函数返回多值(返回值数据类型相同时简写)

当返回值的数据类型相同时可以只保留一个数据类型即可:

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)
}

运行结果:
image.png

函数注意点

有名称的返回值在函数体内需要赋值

  • 函数中有名称的返回值需要在函数中对名称进行赋值:

    • 就像下方的函数中的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)
    }

    运行结果:
    image.png
    可以看到没有对返回值赋值打印出来的都是初始化值0

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏