オプション関数
関数で設定します
「オプション関数」は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フィードバックを取得できます。ローカル設定は不要です。