関数も型定義できます。
同じ型であることの条件
関数は以下が同じであれば、同じ型となります。これを関数のシグネチャーと呼びます。
- 引数の数と型
- 戻り値の数と型
定義
以下のようにtypeキーワードを使用して関数の型を定義出来ます。
// 関数タイプ定義
type myFuncType func(int, int) int
使用例
以下のように関数型を使用して、ポリモーフィズムのような使い方が出来ます。
足し算と引き算を行います。
package main
import (
"fmt"
)
// 関数タイプ定義
type myFuncType func(int, int) int
// 計算構造体定義
type myStructType struct {
arg1 int
arg2 int
result myFuncType
}
func main() {
// 足し算
calc := myStructType{
arg1: 1,
arg2: 1,
result: addFunc,
}
fmt.Println(calculation(calc)) // 2 が表示される。
// 引き算
calc = myStructType{
arg1: 1,
arg2: 1,
result: subFunc,
}
fmt.Println(calculation(calc)) // 0 が表示される。
}
// 足し算関数
func addFunc(arg1, arg2 int) int {
return arg1 + arg2
}
// 引き算関数
func subFunc(arg1, arg2 int) int {
return arg1 - arg2
}
// 計算関数
func calculation(my myStructType) int {
return my.result(my.arg1, my.arg2)
}
ただし、このような使い方が良いのかは不明です。