golang 函数

函数作为值、类型

在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型

type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])

函数作为类型到底有什么好处呢?那就是可以把这个类型的函数当做值来传递,请看下面的例子

package main
import "fmt"

type testInt func(int) bool // 声明了一个函数类型

func isOdd(integer int) bool {
    if integer%2 == 0 {
        return false
    }
    return true
}

func isEven(integer int) bool {
    if integer%2 == 0 {
        return true
    }
    return false
}

// 声明的函数类型在这个地方当做了一个参数

func filter(slice []int, f testInt) []int {
    var result []int
    for _, value := range slice {
        if f(value) {
            result = append(result, value)
        }
    }
    return result
}

func main(){
    slice := []int {1, 2, 3, 4, 5, 7}
    fmt.Println("slice = ", slice)
    odd := filter(slice, isOdd)    // 函数当做值来传递了
    fmt.Println("Odd elements of slice are: ", odd)
    even := filter(slice, isEven)  // 函数当做值来传递了
    fmt.Println("Even elements of slice are: ", even)
}

函数当做值和类型在我们写一些通用接口的时候非常有用,通过上面例子我们看到testInt这个类型是一个函数类型,然后两个filter函数的参数和返回值与testInt类型是一样的,但是我们可以实现很多种的逻辑,这样使得我们的程序变得非常的灵活。

### Golang函数签名的相关知识 #### 什么是函数签名? 在 Go 语言中,函数签名为函数的定义提供了标准化的形式。它描述了一个函数的核心特征,包括名称、输入参数列表以及返回值型[^3]。 #### 函数签名的基本结构 一个典型的函数签名由以下几个部分组成: 1. **函数名**:用于标识函数。 2. **参数列表**:指定函数接收的输入数据及其对应的型。 3. **返回值型**:声明函数执行完成后会返回的数据型。 以下是函数签名的一般形式: ```go func functionName(parameter1 type1, parameter2 type2) (returnType1, returnType2) ``` #### 示例分析 以下是一个简单的函数签名示例,展示如何定义一个具有具体参数和返回型的函数: ```go package main import "fmt" // 定义一个实现两数相加功能的函数 func addNum(x int, y int) int { ret := x + y return ret } func main() { result := addNum(5, 7) fmt.Println("Result:", result) } ``` 在这个例子中,`addNum` 的函数签名为 `func(x int, y int) int`,表示该函数接受两个整型参数并返回一个整型结果[^2]。 #### 多返回值的函数签名 Go 支持多返回值的功能,这使得函数设计更加灵活。例如,以下代码片段展示了带有多个返回值的函数签名: ```go package main import "fmt" // 返回商和余数 func divide(dividend float64, divisor float64) (float64, float64) { quotient := dividend / divisor remainder := dividend % divisor return quotient, remainder } func main() { q, r := divide(10, 3) fmt.Printf("Quotient: %.2f, Remainder: %.2f\n", q, r) } ``` 在此处,`divide` 的函数签名为 `func(float64, float64) (float64, float64)`,表明其接收两个浮点数作为参数,并返回两个浮点数值[^5]。 #### 匿名函数函数变量 除了常规命名函数外,Go 还支持匿名函数的概念。这些无名函数可以直接赋值给变量或者立即执行。下面是一段关于匿名函数的示例代码: ```go package main import "fmt" func main() { // 将匿名函数赋值给变量 f 并调用 var f func(int, int) int f = func(a, b int) int { return a * b } fmt.Println(f(3, 4)) // 输出 12 // 立即执行匿名函数 sum := func(numbers ...int) int { total := 0 for _, num := range numbers { total += num } return total }(1, 2, 3, 4, 5) fmt.Println(sum) // 输出 15 } ``` 上述代码说明了如何创建和使用匿名函数来简化逻辑处理过程[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值