0Pricing
Go Academy · レッスン

オプション関数

関数で設定します

「オプション関数」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

関数で設定する

基本的な考え方は、各オプション設定をConfigを変更する関数として表現することです。これらが「オプション関数」です。

Option型

Optionを、Config構造体へのポインターを受け取る関数として定義します。

package main

import "fmt"

type Config struct {
	Port    int
	Timeout int
}

type Option func(*Config)

func main() {
	var o Option
	fmt.Println(o == nil)
}

Optionを書く

Optionは、1つのフィールドを設定するクロージャを返します。WithPort(9000)は、Port = 9000を代入する関数を生成します。

package main

import "fmt"

type Config struct{ Port int }
type Option func(*Config)

func WithPort(p int) Option {
	return func(c *Config) { c.Port = p }
}

func main() {
	c := &Config{}
	WithPort(9000)(c)
	fmt.Println(c.Port)
}

クロージャで値をキャプチャする

返される関数は引数をクロージャとして取り込みます。WithPort(9000)は、後で適用されるまで9000を覚えています。

複数のOption

各設定に専用のオプション関数を用意します。これらはすべて同じOption型を共有します。

package main

import "fmt"

type Config struct {
	Port    int
	Timeout int
}
type Option func(*Config)

func WithPort(p int) Option    { return func(c *Config) { c.Port = p } }
func WithTimeout(t int) Option { return func(c *Config) { c.Timeout = t } }

func main() {
	c := &Config{}
	WithPort(80)(c)
	WithTimeout(15)(c)
	fmt.Printf("%+v\n", *c)
}

真偽値フラグのOption

パラメーターを取らないOptionで、フラグを切り替えられます。

package main

import "fmt"

type Config struct{ TLS bool }
type Option func(*Config)

func WithTLS() Option { return func(c *Config) { c.TLS = true } }

func main() {
	c := &Config{}
	WithTLS()(c)
	fmt.Println(c.TLS)
}

Optionのスライスを適用する

Optionをスライスに集め、ループですべてを適用します。これが、次に構築するコンストラクターの中心部分です。

package main

import "fmt"

type Config struct{ Port, Timeout int }
type Option func(*Config)

func WithPort(p int) Option    { return func(c *Config) { c.Port = p } }
func WithTimeout(t int) Option { return func(c *Config) { c.Timeout = t } }

func main() {
	c := &Config{}
	opts := []Option{WithPort(8080), WithTimeout(30)}
	for _, opt := range opts {
		opt(c)
	}
	fmt.Printf("%+v\n", *c)
}

順序が重要

Optionは順番に適用されます。2つのOptionが同じフィールドを設定する場合は、後のOptionが優先されます。便利なこともありますが、ドキュメントに記載すべき落とし穴にもなります。

命名規則

慣例として、Optionを生成する関数にはWith...という名前を付けます(例:WithPort、WithTLS)。これにより、呼び出し箇所が英語の文章のように読めます。

Optionにロジックを持たせる

Optionは単なる関数なので、値を代入するだけでなく、検証、計算、値の組み合わせも行えます。

ここでは関数が構造体より適している理由

  • 指定したフィールドだけを設定できる
  • 呼び出し箇所で名前から意図が分かる
  • 呼び出し側を壊さずに新しいOptionを追加できる

クイックチェック

オプション関数に関する知識を確認しましょう。

まとめ

オプション関数の構築方法を学びました。

  • type Option func(*Config)を定義する
  • WithX関数はConfigを変更するクロージャを返す
  • Optionのスライスをループで適用する
  • 順序が重要で、最後の書き込みが優先される

よくある質問

「オプション関数」レッスンは無料ですか?

はい。「オプション関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「オプション関数」で何を学びますか?

関数で設定します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「オプション関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パラメータが多い場合の問題
  2. オプション関数
  3. 柔軟なAPIの構築
  4. デフォルト値とバリデーション
← Go Academyに戻る