カテゴリ: Go言語 更新日: 2026/02/20

Go言語の高階関数の基本!関数を引数に渡す方法

Go言語の高階関数の基本!関数を引数に渡す方法
Go言語の高階関数の基本!関数を引数に渡す方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Go言語で関数をほかの関数に渡すことができるって聞きました。どういう意味ですか?」

先生

「それは『高階関数(こうかいかんすう)』と呼ばれるもので、関数を引数として渡せる仕組みのことです。これを使うとコードをもっと便利で柔軟に書けますよ。」

生徒

「関数を引数に渡すって、ちょっとイメージがわかないです。具体的に教えてもらえますか?」

先生

「もちろんです。わかりやすく説明していきますね!」

1. 高階関数とは?

1. 高階関数とは?
1. 高階関数とは?

「高階関数(こうかいかんすう)」とは、関数を値として扱える考え方のことです。具体的には、関数をほかの関数の引数として渡したり、逆に処理の結果として戻り値として返したりできます。Go言語では関数も数値や文字列のように一種のデータとして扱えるため、処理の差し替えや共通化がとても簡単になります。たとえば、「料理のレシピ」に対して「ソースをかける手順」を差し替えるように、やり方(関数)を外から渡して実行するイメージです。

初心者の方は「関数=箱」と考えると理解しやすいでしょう。箱の中には「やりたい処理」が入っており、その箱ごと別の関数に手渡すことで、受け取った側は中身の処理を好きなタイミングで実行できます。これがコールバックやイベント処理、配列の加工などでよく使われる基本パターンです。

下の短い例は、Go言語で「関数を引数に渡す」雰囲気をつかむためのミニサンプルです(仕組みの詳細は次の章で順に説明します)。


package main

import "fmt"

// 関数を引数に受け取って実行する高階関数
func apply(action func(string) string, name string) {
    fmt.Println(action(name))
}

func main() {
    // 関数をそのまま渡す(無名関数でもOK)
    hello := func(s string) string { return "こんにちは、" + s }
    apply(hello, "太郎")
}

ここではactionという「やり方」を外から受け取り、applyが中で呼び出しています。つまり、動作の具体的な中身を後から差し替えられるのが高階関数の強みです。Go言語の高階関数は、関数を引数に渡す、無名関数をその場で作って渡す、コールバックとして実行する、といった柔軟な書き方につながります。

2. Go言語で関数を引数に渡す方法

2. Go言語で関数を引数に渡す方法
2. Go言語で関数を引数に渡す方法

Go言語では、関数も数値や文字列と同じ「値」として扱えるため、関数を引数に渡すことができます。ポイントは、受け取る側の引数に関数の型(例:func(int) int)を指定することです。これにより、処理のやり方だけを外から差し替えられるため、共通化・再利用・カスタマイズが簡単になります。高階関数やコールバックの基本パターンとして覚えておくと、配列処理や文字列処理など幅広い場面で役立ちます。


package main

import "fmt"

// 関数の型を別名にすると読みやすい(オプション)
type Op func(int) int

// 受け取った関数をその場で実行する高階関数
func process(f Op, value int) int {
    return f(value)
}

// 渡す側の関数(例:2倍にする)
func double(x int) int { 
    return x * 2 
}

func main() {
    // 名前付き関数を渡す
    r1 := process(double, 5) // 10

    // 無名関数をその場で渡す(簡単な処理の差し替えに便利)
    r2 := process(func(x int) int { return x + 3 }, 5) // 8

    fmt.Println(r1, r2)
}

上の例では、processが「やり方」をOp型として受け取り、与えられた数値に適用しています。doubleのような名前付き関数も、無名関数も同じように渡せるため、Go言語の高階関数は柔軟に組み合わせられます。まずは「関数の型を引数に書く」→「関数を渡す」→「中で呼び出す」という流れを身につけましょう。

3. 関数を引数に渡す実例

3. 関数を引数に渡す実例
3. 関数を引数に渡す実例

ここでは、Go言語の高階関数として「関数を引数に渡す」使い方を具体例で確認します。ポイントは、処理の“やり方”だけを外から差し替えられることです。関数を引数に渡すことで、同じ枠組みのまま計算ロジックを入れ替えられるので、再利用性と可読性が上がります。無名関数やコールバックの基本練習としても最適です。


package main

import "fmt"

// 「関数の型」を別名で用意(前章と同じスタイル)
type Op func(int) int

// 受け取った「やり方(関数)」を値に適用
func process(f Op, v int) int {
    return f(v)
}

// 名前付き関数の例
func square(x int) int { return x * x }
func triple(x int) int { return x * 3 }

func main() {
    // 名前付き関数を渡す
    r1 := process(square, 5) // 25
    r2 := process(triple, 5) // 15

    // 無名関数をその場で渡す(条件に応じた処理を埋め込める)
    r3 := process(func(n int) int {
        if n%2 == 0 { return n / 2 }
        return n * 2
    }, 6) // 3

    fmt.Println(r1, r2, r3)
}

上の例では、processが共通の受け皿になり、squaretriple無名関数という三つの“やり方”を切り替えています。
・同じ関数枠に対して計算ロジックだけ差し替えられるのが高階関数の強みです。
無名関数を使えば、一時的なルール(例:偶数は半分、奇数は二倍)をその場で記述できます。
このように、Go言語の高階関数/関数を引数に渡す書き方を身につけると、処理の共通化・拡張・保守がぐっと楽になります。

4. 無名関数(名前のない関数)を使って渡す方法

4. 無名関数(名前のない関数)を使って渡す方法
4. 無名関数(名前のない関数)を使って渡す方法

関数を一時的に作って渡す場合は、「無名関数」と呼ばれる名前のない関数を使います。
例えば、次のように書きます。


func main() {
    result := process(func(x int) int {
        return x + 10
    }, 5)
    fmt.Println(result)  // 15
}

このように、関数を直接引数の場所に書いて渡せます。簡単な処理をその場で書くのに便利です。

5. 高階関数を使うメリット

5. 高階関数を使うメリット
5. 高階関数を使うメリット
  • 処理の共通部分をまとめてコードを簡単にできる
  • 繰り返し使う動作を外から差し替えられる
  • コードの再利用性が高まる

例えば、数字を加工する処理が複数あるとき、共通の処理関数に加工方法の関数だけ渡すと楽に書けます。

6. 高階関数を使うと何がうれしい?

6. 高階関数を使うと何がうれしい?
6. 高階関数を使うと何がうれしい?

今回はGo言語の高階関数について学びました。
高階関数は「関数を引数に渡せる関数」のことで、関数を自由に組み合わせて使うことができます。
無名関数を使うことで、その場で処理を作って渡せるのも便利です。
この考え方を理解すると、プログラムがより柔軟で読みやすくなります。

まとめ

まとめ
まとめ

今回はGo言語でとても重要な考え方である高階関数について、関数を引数に渡す仕組み、無名関数で一時的な処理を定義する方法、そしてコードの再利用性を高める書き方まで、ひと通り整理しました。高階関数という言葉は難しそうに聞こえますが、実際には「関数という道具を箱のように扱い、それを別の関数に渡して処理を変化させる」だけです。数字を二倍にする、引き算をする、文字列を加工する、どんな処理でも関数にしてしまえば、共通の流れの中で差し替えることができ、複雑なロジックを簡潔に整理できます。 Go言語は構文がシンプルで覚えやすい一方、書き方に慣れていない初心者のうちは、同じような処理を何度も書いてしまいがちです。そのような場面こそ、高階関数が活躍します。例えば「数字を加工して結果を返す」という枠だけ決めておき、加工方法は外から渡すようにすれば、重複が消えて保守しやすくなります。特に、無名関数をすぐに書いてそのまま渡せる点はとても便利で、一時的なルールや試し書きにも向いています。 実際の開発では、配列やスライスに対するフィルタリング、マッピング、集計のような処理でも高階関数が役に立ちます。もし同じようなループを何度も書いていると感じた場合、共通の流れを一か所にまとめて、変えたい部分だけ関数にして渡すように考えると、コードが読みやすくなり、後から見たときの理解もしやすくなります。複雑なプログラムほど、こうした再利用できる形にしておくことが、結果として時間の節約にもつながります。

サンプルプログラムでもう一度整理

同じ仕組みでも、使い方次第で表現が増えることを確認してみましょう。次の例では、同じ数字に対して複数の処理を差し替えています。


package main

import "fmt"

type Op func(int) int

func apply(x int, f Op) int {
    return f(x)
}

func main() {
    r1 := apply(3, func(n int) int { return n * 3 })
    r2 := apply(3, func(n int) int { return n - 1 })
    r3 := apply(3, func(n int) int { return n + 10 })

    fmt.Println(r1, r2, r3)
}

applyという共通の枠を作り、その枠の中身だけ無名関数で変えています。同じ数字でも、三倍、マイナス一、十を足す、など自由に差し替えができる点が高階関数の魅力です。処理が多くなっても、差し替えたい部分だけを書くので、読んだ人にとっても理解がしやすく、動きの違いもはっきりします。

実際の開発で役立つ場面

開発では、ログの書き換え、エラーチェック、入力データの整形など、ほんの一部分だけ違う処理を差し込みたい場面が出てきます。処理の流れを毎回書くのではなく、外から渡して差し替えられるようにすると、テストもしやすく、将来の修正にも強くなります。特に関数の引数で振る舞いを切り替える書き方は、Go言語のコードを多く読むと頻繁に見かけるため、知っておくと理解のスピードも上がります。

初心者のうちは「関数を変数のように扱える」という発想そのものが新しく感じるかもしれません。数値や文字列と同じように、関数にも型があり、引数に渡せる、戻り値にできるという仕組みを理解すると、プログラムの見える世界が広がります。無理に難しい書き方をする必要はありませんが、同じ処理が増えてきたら、関数として切り出して渡す習慣をつけると、自然とコードが整っていきます。

先生と生徒の振り返り会話

生徒

「今日の高階関数、最初は難しそうでしたが、実際に書いてみると意外とシンプルでした。関数を引数に渡すだけなんですね。」

先生

「そうなんです。言葉が難しいだけで、仕組みはとても素直ですよ。処理の流れと、差し替えたい部分を分けて考えるだけで、コードの見通しがずいぶん良くなります。」

生徒

「無名関数をそのまま渡せるのも便利でした。ちょっとした計算なら別で定義しなくても使えますね。」

先生

「その通り。一時的なルールを書きたいときに役立ちます。慣れてくると、スライスの加工やデータの整形でも自然に使うようになりますよ。」

生徒

「次はスライスの処理にも応用してみます。関数を渡す考え方が理解できると、いろんな書き方ができる気がして楽しいです。」

先生

「その気持ちがあれば大丈夫です。難しそうに感じる場面でも、共通の部分と差し替える部分を整理すると、必ず書けるようになりますよ。」

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Go言語の高階関数とは何ですか?プログラミング初心者でも理解できるように説明してほしいです

高階関数とは、関数を引数として受け取ったり、関数を戻り値として返したりできる関数のことです。普通の変数と同じように関数を扱う考え方なので、Go言語ではとても便利です。プログラミング初心者の人でも、高階関数を理解するとコードを短くシンプルにできるため、学ぶ価値が高い機能です。
関連セミナーのご案内

【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のwhile的なforループの使い方!条件式ループの基本を解説
New2
Go言語
Go言語プログラムの実行方法まとめ!VSCode・ターミナルでの実行手順を解説
New3
Swift
Swift意味とは?プログラミング言語・金融・鳥の違いを徹底解説
New4
Swift
Swift 戻り値の扱い方と複数戻り値の返し方|初心者でも分かる関数の基本
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語でリダイレクト処理を行う方法(http.Redirect)を初心者向けに解説
No.2
Java&Spring記事人気No2
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.6
Java&Spring記事人気No6
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.7
Java&Spring記事人気No7
Go言語
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.8
Java&Spring記事人気No8
Kotlin
Kotlinのログ出力方法を完全ガイド!LogcatとTimberでトラブルシューティング