3 回答

TA貢獻1829條經驗 獲得超7個贊
package main
import (
"fmt"
)
type Lx func(int) int
func cmb(f, g Lx) Lx {
return func(x int) int {
return g(f(x))
}
}
func inc(x int) int {
return x + 1
}
func sum(x int) int {
result := 0
for i := 0; i < x; i++ {
result += i
}
return result
}
func main() {
n := 666
fmt.Println(cmb(inc, sum)(n))
fmt.Println(n * (n + 1) / 2)
}
輸出:
222111
222111

TA貢獻1810條經驗 獲得超4個贊
規(guī)范中的相關部分:函數類型。
這里的所有其他答案都首先聲明一個新類型,這種類型很好(實踐),并使您的代碼更易于閱讀,但知道這不是必需的。
您可以使用函數值而無需為它們聲明新的類型,如下面的示例所示。
聲明一個函數類型的變量,該變量具有2個類型的參數,float64并且具有一個類型的返回值,float64如下所示:
// Create a var of the mentioned function type:
var f func(float64, float64) float64
讓我們編寫一個返回加法器函數的函數。此加法器函數應采用2個類型的參數,float64并在調用時應返回這2個數字的和:
func CreateAdder() func(float64, float64) float64 {
return func(x, y float64) float64 {
return x + y
}
}
讓我們編寫一個具有3個參數的函數,前2個是type float64,第3個是函數值,該函數需要2個type的輸入參數float64并產生type的值float64。然后,我們正在編寫的函數將調用傳遞給它的函數值作為參數,并使用前兩個float64值作為函數值的參數,并返回傳遞的函數值返回的結果:
func Execute(a, b float64, op func(float64, float64) float64) float64 {
return op(a, b)
}
讓我們來看一下前面的示例:
var adder func(float64, float64) float64 = CreateAdder()
result := Execute(1.5, 2.5, adder)
fmt.Println(result) // Prints 4
請注意,當然也可以使用短變量聲明創(chuàng)建時adder:
adder := CreateAdder() // adder is of type: func(float64, float64) float64
在Go Playground上嘗試這些示例。
使用現有功能
當然,如果您已經在具有相同函數類型的包中聲明了一個函數,則也可以使用該函數。
例如,math.Mod()具有相同的功能類型:
func Mod(x, y float64) float64
因此,您可以將此值傳遞給我們的Execute()函數:
fmt.Println(Execute(12, 10, math.Mod)) // Prints 2
打印,2因為12 mod 10 = 2。請注意,現有功能的名稱充當功能值。
在Go Playground上嘗試一下。
筆記:
請注意,參數名稱不是該類型的一部分,具有相同參數和結果類型的2個函數的類型相同,而與參數名稱無關。但是要知道,在參數或結果列表中,名稱必須全部存在或不存在。
因此,例如,您還可以編寫:
func CreateAdder() func(P float64, Q float64) float64 {
return func(x, y float64) float64 {
return x + y
}
}
或者:
var adder func(x1, x2 float64) float64 = CreateAdder()
- 3 回答
- 0 關注
- 220 瀏覽
添加回答
舉報