概要
複数の言語を扱っていると仕様が混ざるので、まとめておく。
前回:
Go 言語仕様1(変数、型)
内容
- 関数
関数
- 基本的なところ
package main
import "fmt"
// NoReturn return値なし
func NoReturn(s string) {
fmt.Println(s)
}
// Return return値あり
func Return(x int, y int) int {
return x + y
}
// ReturnSome return値複数あり
func ReturnSome(x int, y int) (int, int) {
plus := x + y
minus := x - y
return plus, minus
}
// Default returnの変数をデフォルトで宣言しておく
func Default(ss string) (result string) {
// 関数内で宣言の必要なし
result = "Hello, " + ss
// return値も省略可
return
}
func main() {
NoReturn("Golang") // Golang
sum := Return(10, 20)
fmt.Println(sum) // 30
p, m := ReturnSome(1000, 200)
fmt.Println(p, m) // 1200 800
fmt.Println(Default("Golang")) // Hello, Golang
}
- 無名関数
package main
import "fmt"
func main() {
// 関数名は付けない。関数を変数に格納するイメージ。
f := func(x int, y int) int {
return x + y
}
fmt.Println(f(20, 10)) // 30
// 直接実行することもできる
ff := func(x int, y int) int {
return x + y
}(20, 10)
fmt.Println(ff) // 30
}
- 引数、戻り値に関数を指定する
package main
import "fmt"
// Return 関数をreturnする
func Return() func() {
return func() {
fmt.Println("Golang")
}
}
// Execute 引数で渡ってきた関数を実行する
func Execute(f func()) {
f()
}
func main() {
f := Return()
f()
Execute(f)
}
- クロージャー
package main
import "fmt"
// LaterFunc クロージャー
func LaterFunc() func(int) int {
var sum int
// LaterFunc内で定義された無名関数は、LaterFunc内のローカル変数sumにアクセスできる
return func(i int) int {
result := sum
sum = sum + i
return result
}
}
func main() {
// 戻り値の無名関数も、LaterFunc内のローカル変数sumにアクセスできる
f := LaterFunc()
// さらに、ローカル変数sumの値は保持される
fmt.Println(f(10)) // 0
fmt.Println(f(10)) // 10
fmt.Println(f(10)) // 20
fmt.Println(f(10)) // 30
fmt.Println(f(10)) // 40
}