匿名の構造体
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 15/107。
anonymous structは、名前付きの型を持たないstructです。typeキーワードを使わずに、その構造を定義してインスタンスを1つの手順で作成します。
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}これにより、再利用可能な型を宣言せずに struct の値を直接作成します。anonymous struct は、コード内の他の場所では使用しない、すぐに使える一度限りのデータ構造が必要な場合に便利です。
一般的な使用例は、1つの関数またはテストに関連するデータをグループ化することです。
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhost匿名構造体は、各テストケースに固有のフィールドがあるテーブル駆動テストでもよく使われます。
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}anonymous 構造体には型名がないため、メソッドを定義したり、その型を他の場所で再利用したりすることはできません。一時的で局所的なデータのグループ化に使用してください。複数回参照するものについては、代わりに名前付き構造体型を定義します。
チャレンジ
簡単再利用可能な型を必要としない、一度限りのデータのグループ化で anonymous 構造体が活躍する場面を示す、簡単な configuration system を作ってみましょう。
コードを2つのファイルに分けて整理します。
config.go: server 名(string)、port(int)、debug モード(bool)を Parameters として takes 関数GetServerConfigを create します。この関数は、これら3つの values をName、Port、Debugという fields として含む anonymous struct を Return する必要があります。この configuration は1か所でしか使われないため、名前付き型を定義する必要はありません。main.go: input から server configuration の values を Read し、GetServerConfig関数を呼び出して、configuration の詳細を表示します。
次の input が provided されます。
- Line 1: server 名
- Line 2: port 番号
- Line 3: Debug モード(
trueまたはfalse)
出力 format:
Server: [Name]
Port: [Port]
Debug: [Debug]たとえば、api-server、8080、true が provided された場合、出力は次のようになります。
Server: api-server
Port: 8080
Debug: trueanonymous struct を使うと、一度しか使わない型で codebase を煩雑にすることなく、グループ化した data を Return できる点に注目してください。
REQUIRED OUTPUT FORMAT:自分で試してみよう
package main
import (
"fmt"
)
func main() {
// 入力値を読み取る
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: 入力値で GetServerConfig を呼び出す
// そして返された匿名構造体を格納する
// TODO: 必要な形式で設定を出力する:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ