golang之函数

BigSun丶 / 2024-02-21 / 原文

目录
  • 一、什么是函数
  • 二、函数的定义
  • 三、函数的返回值
    • 1. 多个返回值
    • 2. 命名返回值
  • 四、函数的参数
    • 1. 可变长参数

一、什么是函数

  • 简单来说就是一个特定的方法,通过这个方法产生预期的结果。
  • 函数是一块执行特定任务的代码。一个函数是在输入源基础上,通过执行一系列的算法,生成预期的输出

二、函数的定义

1. 定义函数的语法

func 函数名(参数1 参数1类型,参数2 参数2类型) 返回值类型 {
    // 函数体(代码块)
}

1.1 示例,定义一个计算总价的函数
func calculateBill(price int, no int) int {  
    var totalPrice = price * no // 商品总价 = 商品单价 * 数量
    return totalPrice // 返回总价
}

2. *****************函数中的参数列表和返回值并非是必须的,所以下面这个函数的声明也是有效的***************
func test1() {  
    // 译注: 表示这个函数不需要输入参数,且没有返回值
}

3. 若参数或者返回值都为同一个类型的,则可以简写
func 函数名(参数1,参数2 参数类型...) 返回值类型 {
    // 函数体(代码块)
}

三、函数的返回值

  • 注意:函数的返回值不能直接调用,必须先用变量接收后,再使用这个接收了返回值的变量
  • 想接收一个函数的返回值,该函数有几个返回值必须要声明几个变量来接收,也可以用匿名变量(或者叫空白符) _ 来接收某个返回值

1. 多个返回值

  • go中是支持多个返回值的,返回值类型用括号括起来即可
1. 语法是

func 函数名(参数1 参数1类型,参数2 参数2类型) (返回值1类型,返回值2类型) {
    // 函数体(代码块)
    return 值1,值2...
}

1.1 示例,定义一个计算矩形的周长和面积的函数

package main

import (  
    "fmt"
)

func rectProps(length, width float64)(float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}

func main() {  
    area, perimeter := rectProps(10.8, 5.6)
    fmt.Printf("Area %f Perimeter %f", area, perimeter) 
}

2. 命名返回值

  • 在定义函数时,若指定了返回值的变量名,则在函数体中,也不用重新声明该返回的变量,不需要再明确指定返回值
1. 若返回值都为同一个类型的,则可以简写
func 函数名(参数1,参数2 参数类型) (返回值1,返回值2 返回值类型) {
    // 函数体(代码块)
}

1.1 如下面的rectProps方法
func rectProps(length float64, width float64)(area float64, perimeter float64) {  
    area = length * width
    perimeter = (length + width) * 2
    return // 不需要明确指定返回值,默认返回 area, perimeter 的值
}

1.1.1 可以简写为:
func rectProps(length, width float64)(area, perimeter float64) {  
    area = length * width  // 直接赋值,不用声明
    perimeter = (length + width) * 2  // 直接赋值,不用声明
    return // 不需要明确指定返回值,默认返回 area, perimeter 的值
}

四、函数的参数

1. 可变长参数

  • 和python不同的是,go中没有位置参数和关键字参数的概念,go中都是按照位置传参
1. go中保存多个参数用的是 ...

func 函数名(参数 ... 参数类型)(返回值 ... 返回值类型) {
    // 函数体(代码块)
}


package main

import (  
    "fmt"
)

func test1(a ...int) {  
    fmt.Println("a :", a)
}


func main() {  
    test1(1,2,3,4,5,6)
}

// 打印结果:  a : [1 2 3 4 5 6]