関数 #
関数を定義する #
普通の関数の定義、可変長引数を持つ関数の定義、返り値の変数名を持つ関数の定義を紹介する。
package main
import (
"fmt"
)
func main() {
fmt.Println(Hello(3)) // == hello hello hello
fmt.Println(Echo("aaa", "bbb", "ccc")) // == aaa bbb ccc
fmt.Println(Double(100)) // == 200
}
// 通常の関数定義
func Hello(n int) string {
s := ""
for i := 0; i < n; i++ {
s += "hello "
}
return s
}
// 可変長引数を持つ関数
func Echo(in ...string) string {
s := ""
for _, v := range in {
s += v + " "
}
return s
}
// 返り値に変数名をつけると return だけで定義した返り値を返す
func Double(n int) (m int) {
m = n * 2
return
}
無名関数を値として扱う #
無名関数を値として変数に代入し、他の関数の引数として取り扱ったりできる。
無名関数の型は func(引数の型)返り値の型
というものになる。
package main
import (
"fmt"
)
func main() {
// 無名関数を定義する
f := func(s string) int {
return len(s)
}
// 実行する
fmt.Println(f("hello world")) // == 11
// 関数型の値を引数として渡す
fmt.Println(funcStringIntUser(f)) // == function return value is 4
}
// 関数型の値を引数として受け取る
func funcStringIntUser(f func(string) int) string {
return fmt.Sprintf("function return value is %d", f("test"))
}
無名関数の型名を定義する #
無名関数の型は func(引数の型)返り値の型
というものだがこれに MyFunc
などの名前をつけることができる。
名前をつけることで関数型の意味を明確にできるし、長すぎる型名を省略できて取り回しもしやすくなる。
package main
import (
"fmt"
)
// 関数の型に名前をつける
type consumer func(int)
// 定義した関数型を引数とする関数
func provider(c consumer) {
c(100)
}
func main() {
printer := func(n int) {
fmt.Printf("printer: %d\n", n)
}
provider(printer) // == printer: 100
total := 0
aggregator := func(n int) {
total += n
}
provider(aggregator)
provider(aggregator)
provider(aggregator)
fmt.Println(total) // == 300
}