Menu
Coddy logo textTech

匿名の構造体

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 構造体には型名がないため、メソッドを定義したり、その型を他の場所で再利用したりすることはできません。一時的で局所的なデータのグループ化に使用してください。複数回参照するものについては、代わりに名前付き構造体型を定義します。

challenge icon

チャレンジ

簡単

再利用可能な型を必要としない、一度限りのデータのグループ化で anonymous 構造体が活躍する場面を示す、簡単な configuration system を作ってみましょう。

コードを2つのファイルに分けて整理します。

  • config.go: server 名(string)、port(int)、debug モード(bool)を Parameters として takes 関数 GetServerConfig を create します。この関数は、これら3つの values を NamePortDebug という 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-server8080true が provided された場合、出力は次のようになります。

Server: api-server
Port: 8080
Debug: true

anonymous struct を使うと、一度しか使わない型で codebase を煩雑にすることなく、グループ化した data を Return できる点に注目してください。

REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

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]
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ