Golang学習ノート(十一)関数変数、関数を値として使用
1859 ワード
Golangでは、関数を変数として使用することもできます.普通の関数を書いて文字列を作成し、大文字と小文字を交互に表示します.
関数を変数とする関数をもう1つ書きます.
このときmain()でstringToCase 1()関数を実行し、上のprocesscase 1()関数をパラメータ変数として使用します.
stringToCase 1()をさらに簡略化し、typeキーを使用して関数をカスタムタイプにします.
PS:typeのカスタムタイプはmain()の上に書くのが一般的です.
このときmain()でstringToCase 2()関数を実行し、上のprocesscase 1()関数をパラメータ変数として使用します.
奇数偶数を判断する例を書きます.
奇数を判断する関数を書きます
偶数を判断する関数をもう一つ書きます.
次にフィルタ関数を書きます.ここでforループカウント変数は記録する必要がないので、匿名変数を使用します.
これで例全体で使用する関数が完了し、main()の上にカスタムタイプを申請して、すべての機能を実現します.
最終結果:
func processCase1(str string) string {
result := ""
for i, value := range str {
if i%2 == 0 {
result += strings.ToUpper(string(value))
} else {
result += strings.ToLower(string(value))
}
}
return result
}
関数を変数とする関数をもう1つ書きます.
func stringToCase1(str string, myfunc func(string) string) string {
return myfunc(str)
}
このときmain()でstringToCase 1()関数を実行し、上のprocesscase 1()関数をパラメータ変数として使用します.
fmt.Println(stringToCase1(str, processCase1))
stringToCase 1()をさらに簡略化し、typeキーを使用して関数をカスタムタイプにします.
PS:typeのカスタムタイプはmain()の上に書くのが一般的です.
type caseFunc func(string) string
func main() {
......
}
func stringToCase2(str string, myfunc caseFunc) string {
return myfunc(str)
}
このときmain()でstringToCase 2()関数を実行し、上のprocesscase 1()関数をパラメータ変数として使用します.
fmt.Println(stringToCase2(str, processCase1))
奇数偶数を判断する例を書きます.
奇数を判断する関数を書きます
func isEven(num int) bool {
if num%2 == 0 {
return true
}
return false
}
偶数を判断する関数をもう一つ書きます.
func isOdd(num int) bool {
if num%2 == 0 {
return false
}
return true
}
次にフィルタ関数を書きます.ここでforループカウント変数は記録する必要がないので、匿名変数を使用します.
func filter(arr []int, f myFunc) []int {
var result []int
for _, value := range arr {
if f(value) {
result = append(result, value)
}
}
return result
}
これで例全体で使用する関数が完了し、main()の上にカスタムタイプを申請して、すべての機能を実現します.
type myFunc func(int) bool
func main() {
var nums = []int{10, 20, 30, 15, 17, 21, 33, 22, 57, 88, 99}
fmt.Println(filter(nums,isEven))
fmt.Println(filter(nums,isOdd))
}
最終結果:
[10 20 30 22 88]
[15 17 21 33 57 99]