Golang函数中的函数式参数用法

Golang函数中的函数式参数用法 是否有一种方法可以将一个函数(可以是泛型函数)传递给另一个函数?

7 回复

好的,谢谢您的快速回复。

更多关于Golang函数中的函数式参数用法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是否有办法可以指定函数的运行时类型?

如果函数的类型匹配,你可以将函数传递给函数。由于 Go 没有泛型,你不能传递泛型函数,只能传递那些匹配具体类型的函数。

func(string)string 是一种接收并返回字符串的函数的类型。

因此,以下代码将接收一个该类型的函数和一个字符串,然后返回将该函数应用于该字符串的结果:

def foo(s string, f func(string)string) string {
  return f(s)
}
let
some_fun(a int, b int)x int{
x = a+b
return
}
some_fun2(a string, b string)x string{
x = a+b
return
}
someanother_fun(){
}
main(){
someanother_fun(some_fun)
someanother_fun(some_fun2)
}

有没有办法设计 someanother_fun(),使其在运行时接收类型和输入? 或者任何接近此目标的方法也会有所帮助。

无论你发布的是什么内容,但它无法运行。

someanother_fun 不接受任何参数,而你却两次调用它并传递了一个参数。此外,由于 some_funsome_fun2 具有不同的类型(至少看起来是这样,我不确定 x 应该是什么……),它们不能被传递给接受类似 func() 类型参数的函数。

你可以使用 interface{} 和类型断言/类型开关,但这会放弃编译时的类型安全。

Go 语言没有泛型,并且在 Go 2.0 之前很可能也不会有。

是的,Go语言支持将函数作为参数传递给另一个函数,这通常被称为高阶函数或函数式参数。以下是一个示例,展示了如何将泛型函数作为参数传递:

package main

import "fmt"

// 泛型函数类型
type Mapper[T any, U any] func(T) U

// 接收函数作为参数的函数
func MapSlice[T any, U any](slice []T, mapper Mapper[T, U]) []U {
    result := make([]U, len(slice))
    for i, v := range slice {
        result[i] = mapper(v)
    }
    return result
}

// 具体的映射函数
func IntToString(n int) string {
    return fmt.Sprintf("Number: %d", n)
}

// 泛型映射函数
func Double[T ~int | ~float64](x T) T {
    return x * 2
}

func main() {
    // 示例1:传递普通函数
    numbers := []int{1, 2, 3, 4, 5}
    strings := MapSlice(numbers, IntToString)
    fmt.Println(strings) // [Number: 1 Number: 2 ...]

    // 示例2:传递泛型函数(需要类型实例化)
    floats := []float64{1.1, 2.2, 3.3}
    doubled := MapSlice(floats, func(f float64) float64 {
        return Double(f)
    })
    fmt.Println(doubled) // [2.2 4.4 6.6]

    // 示例3:传递匿名函数
    ints := []int{10, 20, 30}
    squared := MapSlice(ints, func(x int) int {
        return x * x
    })
    fmt.Println(squared) // [100 400 900]
}

在这个示例中:

  1. 定义了Mapper函数类型,它是一个泛型类型,接受两个类型参数TU
  2. MapSlice函数接收一个切片和一个映射函数,将切片中的每个元素通过映射函数转换
  3. 可以传递普通函数(如IntToString)、泛型函数(如Double)或匿名函数作为参数

对于泛型函数作为参数,需要注意类型实例化。虽然不能直接传递未实例化的泛型函数,但可以通过包装函数或匿名函数来实现。

回到顶部