関数

関数 #

関数を定義する #

普通の関数の定義、可変長引数を持つ関数の定義、返り値の変数名を持つ関数の定義を紹介する。

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
}
play_circleRun open_in_newRun In The Playground

無名関数を値として扱う #

無名関数を値として変数に代入し、他の関数の引数として取り扱ったりできる。 無名関数の型は 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"))
}
play_circleRun open_in_newRun In The Playground

無名関数の型名を定義する #

無名関数の型は 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
}
play_circleRun open_in_newRun In The Playground