0Pricing
Go Academy · レッスン

デフォルト値とバリデーション

適切なデフォルト値を設定します

「デフォルト値とバリデーション」は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フィードバックを取得できます。ローカル設定は不要です。

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

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