無名関数とは?Go言語での使いどころをゆっくり解説

Go言語
この記事は約5分で読めます。
Go初学者
Go初学者

関数名の無い無名関数って何?どういう場面で使用されるんですか?

この記事ではGo言語の無名関数について理解することができます!
  • 無名関数とは何?
  • 無名関数の実行方法
  • 無名関数がよく使用される場面は?

Go言語だけでなく、他のプログラミング言語でも使用されている関数名の無い無名関数についてお伝えしていきます。

私自身、無名関数の存在の必要性に疑問を持ったことがありますので、同じような悩みを抱えている方に、少しでもお役に立てるようにしていきますね。

あと、Go言語の関数の基本的なことは別の記事で紹介していますので参考にしてください。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

【Go言語の関数】無名関数とは?

無名関数は関数名の無い関数で、関数名のある関数との違いは関数名のありなしだけで機能的には一緒です。

では、なんでわざわざ無名関数が存在するのでしょうか?

もりぴ
もりぴ

無名関数が無いと仮定した場合の、現役ITエンジニアの声を聞いてみましょう。

エンジニア
エンジニア

一回しか使わない関数にわざわざ関数名つける必要ある?

エンジニア
エンジニア

あー関数名が被っちゃたよ…違う関数名にしないと…一回しか使わない関数なのに。

あくまでも、私の想像の範囲ですがあながち間違ってはいないでしょう。

もりぴ
もりぴ

私みたいに英語が得意でないと、関数名を付けるのも地味に時間がかかります…

あと、関数は引数や戻り値にも関数を与えることができます。

この時に活用されるのが無名関数です。

他の人のプログラムコードを拝見する時に見かけることが多いので、この機会に覚えておきましょう。

Go言語での無名関数

関数名のある関数は関数の外に記述していましたが、無名関数は引数や戻り値、すぐに実行したい関数に用いられるので関数内で記述されることが多い関数です。

それでは、無名関数の記述例を見ていきましょう。

Go言語での無名関数の基本

// 無名関数の基本形
package main

func main() {
    変数名 := func (引数 型) 戻り値の型 {
        // 処理する内容
    }
}

記述自体は関数名が無いだけです。

それでは、足し算を例にコードを書いてみましょう。

// 無名関数で足し算
package main

import "fmt"

func main() {
    add := func(x, y int) int {
	return x + y
    }

    result := add(1, 2)
    fmt.Println(result)
}
// 出力結果
$ go run main.go 
3

ポイントとして、変数add に関数が代入されています。

関数の実行には 変数add を利用して引数を渡し、戻り値を 変数result に代入されている流れです。

無名関数を即実行する

先程は、変数add に関数を代入して実行しましたが、無名関数を即実行する方法もあります。

// 直接、変数に無名関数と引数を渡して実行する方法
package main

import "fmt"

func main() {	
    result2 := func(x, y int) int {
	return x + y
    }(1, 2)  // ここで引数を渡す

    fmt.Println(result2)
}
// 出力結果
$ go run main.go 
3

一回だけ実行される関数であれば、変数をひとつ減らしてコードも1行減らせるので便利な方法です。

Go言語での無名関数の使いどころ

Go言語だけでなく、他のプログラミング言語でも…

  • 関数を戻り値として返す関数
  • 関数を引数に取る関数

があります。

ここで多く使用されるのが、無名関数です。

もりぴ
もりぴ

私もそうでしたが、プログラミング初心者が悩むポイントのひとつです。

では、実際にコードを見ていきましょう。

関数を戻り値として返す関数

// 関数を戻り値として返す関数
package main

import "fmt"

// 返り値の型としてfunc()
func ReturnFunc() func() { 
    // 戻り値に無名関数を使用
    return func() {
	fmt.Println("関数の中の関数です。")
    }
}

func main() {
    // 変数に戻り値の関数を代入する
    f := ReturnFunc()

    // 戻り値の関数を実行する
    f()
}
// 出力結果
$ go run main.go 
関数の中の関数です。

変数f に戻り値の関数が代入され、 f() で実行されます。

関数を引数に取る関数

// 関数を引数に取る関数
package main

import "fmt"

// 引数で受け取った関数を実行する
func CallFunc(f func()) { // 引数に引数名f 型にfunc()
    f() // 引数の関数を実行
}

func main() {
    // CallFuncは引数が関数なので関数を与える
    CallFunc(func() {
	fmt.Println("引数の関数が実行されました。")
    })
}
// 出力結果
$ go run main.go 
引数の関数が実行されました。

関数CallFunc は引数に関数を与える関数なので、関数CallFunc を実行する時に無名関数で関数を与えています。

【まとめ】Go言語の無名関数について

今回は、Go言語の無名関数についてお伝えしてきました。

Go言語の無名関数で押さえておくこと!
  • 無名関数は通常の関数との違いは、関数名があるかないかで機能は変わらない。
  • 無名関数は一回しか使用しない関数に多く使用される。
  • 無名関数は即実行する方法がある。
  • 関数を戻り値として返す関数や、関数を引数に取る関数で多く使用される。

今回の内容を一回で覚えるのは難しいと思いますが、これからプログラムコードを書いていくと無名関数を使用する場面があることでしょう。

実際にコードで書くことで理解が深まっていくはずです。

まずは、無名関数という機能があることを覚えておきましょう。

覚えておくだけで、先輩が書いたコードを拝見する時に役立つはずですからね。

comment

タイトルとURLをコピーしました