デフォルト値とバリデーション
適切なデフォルト値を設定します
「デフォルト値とバリデーション」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
妥当なデフォルト値を設定する
堅牢なコンストラクターは、適切なデフォルト値から始め、Optionで上書きできるようにします。これにより、ゼロ値の落とし穴を完全に避けられます。
適用前に初期化する
まずデフォルト値でConfigを構築し、その上にOptionを適用します。
package main
import "fmt"
type Server struct {
Port int
Timeout int
}
type Option func(*Server)
func WithPort(p int) Option { return func(s *Server) { s.Port = p } }
func NewServer(opts ...Option) *Server {
s := &Server{Port: 8080, Timeout: 30}
for _, o := range opts { o(s) }
return s
}
func main() {
fmt.Printf("%+v\n", *NewServer())
fmt.Printf("%+v\n", *NewServer(WithPort(9000)))
}上書きされるまではデフォルト値を使う
Optionなしで呼び出すとデフォルト値になり、Optionは対象のフィールドだけを置き換えます。両方の利点を得られます。
適用後に検証する
Optionを適用した後、最終的なConfigを検証し、無効な場合はエラーを返します。コンストラクターの戻り値を(*T, error)にします。
package main
import (
"errors"
"fmt"
)
type Server struct{ Port int }
type Option func(*Server)
func WithPort(p int) Option { return func(s *Server) { s.Port = p } }
func NewServer(opts ...Option) (*Server, error) {
s := &Server{Port: 8080}
for _, o := range opts { o(s) }
if s.Port < 1 || s.Port > 65535 {
return nil, errors.New("invalid port")
}
return s, nil
}
func main() {
_, err := NewServer(WithPort(99999))
fmt.Println(err)
}Option内で検証する
別の方法として、Option自体がエラーを返すようにもできます。この場合、Option型はfunc(*Config) errorになります。
package main
import (
"errors"
"fmt"
)
type Server struct{ Port int }
type Option func(*Server) error
func WithPort(p int) Option {
return func(s *Server) error {
if p < 1 {
return errors.New("port must be positive")
}
s.Port = p
return nil
}
}
func NewServer(opts ...Option) (*Server, error) {
s := &Server{Port: 8080}
for _, o := range opts {
if err := o(s); err != nil {
return nil, err
}
}
return s, nil
}
func main() {
_, err := NewServer(WithPort(-1))
fmt.Println(err)
}どの検証方法を選ぶか
個々の設定を検証する場合はOption内で検証し、フィールド間のルール(TLSには証明書のパスが必要、など)を検証する場合は適用後に検証します。多くの場合は両方を使います。
デフォルト値をドキュメント化する
Optionを省略したときに何が設定されるのか利用者に分かるように、各デフォルト値を必ずコンストラクターのドキュメントコメントに記載します。
必須とオプションの区別
本当に必須の値は位置パラメーターとして残し、Optionは本当に任意の値に限定します。必須のデータをOptionの背後に隠してはいけません。
package main
import "fmt"
type Client struct {
BaseURL string
Retries int
}
type Option func(*Client)
func WithRetries(n int) Option { return func(c *Client) { c.Retries = n } }
func NewClient(baseURL string, opts ...Option) *Client {
c := &Client{BaseURL: baseURL, Retries: 3}
for _, o := range opts { o(c) }
return c
}
func main() {
fmt.Printf("%+v\n", *NewClient("https://api"))
}Optionを組み合わせる
複数のOptionを1つのプリセットにまとめ、よく使う設定を表現できます。
package main
import "fmt"
type Server struct{ Port, Timeout int }
type Option func(*Server)
func WithPort(p int) Option { return func(s *Server) { s.Port = p } }
func WithTimeout(t int) Option { return func(s *Server) { s.Timeout = t } }
func Production() Option {
return func(s *Server) {
WithPort(443)(s)
WithTimeout(60)(s)
}
}
func NewServer(opts ...Option) *Server {
s := &Server{Port: 8080, Timeout: 30}
for _, o := range opts { o(s) }
return s
}
func main() {
fmt.Printf("%+v\n", *NewServer(Production()))
}ベストプラクティス
- デフォルト値から始めて、Optionを適用する
- フィールド間のルールは適用後に検証する
- 必須の値は位置パラメーターにする
- すべてのデフォルト値をドキュメント化する
完全で堅牢なAPI
デフォルト値、Option、検証を組み合わせると、柔軟で安全、かつ意図が伝わりやすく、拡張も容易なコンストラクターを実現できます。
クイックチェック
デフォルト値と検証に関する知識を確認しましょう。
まとめ
Functional Optionsパターンを完成させました。
- Optionを適用する前にデフォルト値を設定する
- 適用後に検証するか、フィールド単位の検証はOption内で行う
- 必須の値は位置パラメーターにする
- Optionをプリセットにまとめ、デフォルト値をドキュメント化する
よくある質問
「デフォルト値とバリデーション」レッスンは無料ですか?
はい。「デフォルト値とバリデーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「デフォルト値とバリデーション」で何を学びますか?
適切なデフォルト値を設定します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「デフォルト値とバリデーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パラメータが多い場合の問題
- オプション関数
- 柔軟なAPIの構築
- デフォルト値とバリデーション