Menu
Coddy logo textTech

構造体でのメソッド定義

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 6/68。

Goでは、メソッドは特定の型に属する関数です。単独で存在する通常の関数とは異なり、メソッドはstructsに関連付けられ、カスタムデータ型に対して振る舞いを定義することを可能にします。

メソッドを定義するには、funcキーワードとメソッド名の間にレシーバを配置します。レシーバは、そのメソッドがどの型に属するかを指定します。

type Person struct {
    Name string
    Age  int
}

func (p Person) greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

この例では、(p Person) はレシーバであり、greetPerson 型のメソッドにしています。変数 p は、メソッドが呼び出される Person のインスタンスを表しており、他の言語の this に似ています。

その後、任意の Person インスタンスに対してドット記法を使用してメソッドを呼び出すことができ、構造体にそのデータに関連するアクションを実行する能力を与えます。

quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

challenge icon

チャレンジ

簡単

このチャレンジでは、シンプルな書籍管理システムを作成することで、構造体にメソッドを定義する練習をします。Book 構造体を作成し、その書籍の情報を表示するためのメソッドを定義します。

重要な注意点: 書籍のタイトルや著者名にはスペースが含まれる可能性があるため、入力行全体を読み取るには bufio.Scanner を使用する必要があります。fmt.Scanln 関数は最初のスペースで読み取りを停止するため、複数の単語からなるタイトルや著者名が途切れてしまいます。bufio.NewScanner(os.Stdin) を使用し、scanner.Scan() に続いて scanner.Text() を呼び出すことで、完全な行を読み取ってください。

3つの入力を受け取ります:

  • 書籍のタイトルを表す文字列 (例: "The Go Programming Language")
  • 著者名を表す文字列 (例: "Alan Donovan")
  • ページ数を表す文字列 (例: "380")

あなたのタスクは以下の通りです:

  1. 3つのフィールドを持つ Book 構造体を定義します:Title (string)、Author (string)、Pages (int)
  2. "Title: [title], Author: [author], Pages: [pages]" という形式で書籍情報を出力する、値レシーバを持つ displayInfo という名前のメソッドを作成します。
  3. "[title] by [author]" という形式の文字列を返す、値レシーバを持つ getDescription という名前のメソッドを作成します。
  4. bufio.Scanner を使用して入力行を適切に読み取ります:
    • スキャナーを作成する: scanner := bufio.NewScanner(os.Stdin)
    • 各入力行に対して: scanner.Scan() を呼び出し、次に scanner.Text() を呼び出す
    • これにより、スペースを含むタイトルや著者名が正しく読み取られるようになります
  5. 入力を解析して Book インスタンスを作成します
  6. displayInfo メソッドを呼び出して書籍情報を出力します
  7. getDescription メソッドを呼び出し、返された説明文を出力します

メソッドはレシーバ変数を使用して構造体のフィールドにアクセスし、それぞれの操作を実行する必要があります。値レシーバを持つメソッドは、構造体インスタンスのコピーを操作することを忘れないでください。

チートシート

Goのメソッドは、特定の型に属する関数です。これらは、funcキーワードとメソッド名の間にレシーバを置いて定義されます。

type Person struct {
    Name string
    Age  int
}

func (p Person) greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

レシーバ (p Person) は、greetPerson 型のメソッドにします。変数 p は、メソッドが呼び出されるインスタンスを表します。

メソッドは構造体のインスタンスに対してドット記法を使用して呼び出され、構造体が自身のデータに関連するアクションを実行できるようにします。

自分で試してみよう

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

// TODO: ここで Book 構造体を定義してください

// TODO: ここで displayInfo メソッドを定義してください

// TODO: ここで getDescription メソッドを定義してください

func main() {
    // 入力行を読み取るためのスキャナーを作成します
    scanner := bufio.NewScanner(os.Stdin)
    
    // タイトルを読み取ります
    scanner.Scan()
    title := scanner.Text()
    
    // 著者を読み取ります
    scanner.Scan()
    author := scanner.Text()
    
    // ページ数を読み取ります
    scanner.Scan()
    pagesStr := scanner.Text()
    
    // ページ数の文字列を整数に変換します
    pages, _ := strconv.Atoi(pagesStr)
    
    // TODO: Book インスタンスを作成し、メソッドを呼び出します
    
}
quiz icon腕試し

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

論理とフローのすべてのレッスン