Go言語入門⑥ ~クロージャー・可変長引数~

☑本記事の内容
  • クロージャー
  • 可変長引数
参考資料:現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

クロージャー

✔クロージャーの目次

基本的なこと

  • 関数を数度読み込み、値の変化が起こるようにする
package main

import (
	"fmt"
)

func main() {
	x := 0
	increment := func() int {
		x++
		return x
	}
	fmt.Println(increment())
	fmt.Println(increment())
	fmt.Println(increment())
}
(結果)
1
2
3
  • main関数の中に入れるとxの書き換えを行ってしまう可能性があるので別の関数で使う
  • その関数内でクローズドしてるからクロージャー
package main

import (
	"fmt"
)

func incrementGenerator() func() int {
	x := 0
	return func() int {
		x++
		return x
	}
}

func main() {
	counter := incrementGenerator()
	fmt.Println(counter())
	fmt.Println(counter())
	fmt.Println(counter())
	fmt.Println(counter())
}
(結果)
1
2
3
4

使用例

  • 円周の長さを求める式を例とする
  • 値を変えて違う結果を得たいときにクロージャーは使用される
  • クロージャー自体応用編なので「こんなのあったな」くらいの感覚でOK
package main

import (
	"fmt"
)

func circleArea(pi float64) func(radius float64) float64 {
	return func(radius float64) float64 {
		return pi * radius * radius
	}
}

func main() {
	c1 := circleArea(3.14)
	fmt.Println(c1(2))
	fmt.Println(c1(3))

	fmt.Println("==========")

	c2 := circleArea(3)
	fmt.Println(c2(2))
	fmt.Println(c2(3))
}
(結果)
12.56
28.259999999999998
==========
12
27

可変長引数

基本的なこと

  • 複数の引数を入れる際に使用される
  • 引数を2つに設定した際に3つ入れようとするとエラーになる
package main

import (
	"fmt"
)

func foo(param1, param2 int) {
	fmt.Println(param1)
}

func main() {
	foo(10, 20)
	foo(10, 20, 30)
}
(結果)エラー表示
too many arguments in call to foo
	have (number, number, number)
	want (int, int)
  • 引数のところをと追加することで可変長になる
package main

import (
	"fmt"
)

func foo(params ...int) {
	fmt.Println(len(params), params)
}

func main() {
	foo()
	foo(10, 20)
	foo(10, 20, 30)
}
(結果)
0 []
2 [10 20]
3 [10 20 30]

スライスを入れる場合

  • そのまま入れようとするとエラーになる
package main

import (
	"fmt"
)

func foo(params ...int) {
	fmt.Println(len(params), params)
}

func main() {
	s := []int{1, 2, 3}
	fmt.Println(s)

	foo(s)
}
(結果)エラー表示
cannot use s (type []int) as type int in argument to foo
  • スライスの場合は渡す際にを追加する
package main

import (
	"fmt"
)

func foo(params ...int) {
	fmt.Println(len(params), params) 
}

func main() {
	s := []int{1, 2, 3}
	fmt.Println(s)
	foo(s...)
}
(結果)
[1 2 3]
3 [1 2 3]

Go言語入門⑦へ ≫

≪ Go言語入門⑤へ

目次

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
サカイザ
機械設計→技術営業→SEと転職し、
現在フリーランスエンジニア
北海道出身東京在住
現在、Go案件を受注中
扱えるスキルGo,GCP,Java,AWS,SQL,Python,PHP,etc...
合同会社エンブリオ 代表社員