Menu
Coddy logo textTech

まとめ:構造体の振る舞い

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

challenge icon

チャレンジ

簡単

このチャレンジでは、シンプルな長方形管理システムを作成することで、値レシーバとポインタレシーバの両方の実装を練習します。Rectangle 構造体を作成し、それぞれのレシーバタイプをいつ使用すべきかを示す2つの異なるタイプのメソッドを定義します。

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

  • 長方形の幅を表す文字列 (例: "5.0")
  • 長方形の高さを表す文字列 (例: "3.0")
  • スケーリング係数を表す文字列 (例: "2.0")

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

  1. 2つのフィールド Width (float64) と Height (float64) を持つ Rectangle 構造体を定義する
  2. 長方形の面積(幅 × 高さ)を計算して返す、値レシーバを持つ area という名前のメソッドを作成する
  3. 与えられたスケーリング係数を幅と高さの両方に掛ける、ポインタレシーバを持つ scale という名前のメソッドを作成する
  4. 入力をパースして Rectangle インスタンスを作成する
  5. "Initial area: [area]" という形式を使用して、初期の面積を出力する
  6. スケーリング係数を使用して scale メソッドを呼び出す
  7. "Scaled area: [area]" という形式を使用して、スケーリング後の面積を出力する

面積の値は、整数の場合は整数として表示し(例: 15.0 ではなく 15)、必要な場合は小数点以下を表示してください(例: 15.5)。このチャレンジは、重要な原則を示しています。データの読み取りのみを行うメソッド(面積の計算など)には値レシーバを使用し、元の構造体を変更するメソッド(寸法のスケーリングなど)にはポインタレシーバを使用します。

自分で試してみよう

package main

import (
	"fmt"
	"strconv"
)

// TODO: ここで Rectangle 構造体を定義します

// TODO: ここで値レシーバを使用して area メソッドを実装します

// TODO: ここでポインタレシーバを使用して scale メソッドを実装します

func main() {
	// 入力を読み込む
	var widthStr string
	var heightStr string
	var scaleStr string
	fmt.Scanln(&widthStr)
	fmt.Scanln(&heightStr)
	fmt.Scanln(&scaleStr)
	
	// 入力を float64 にパースする
	width, _ := strconv.ParseFloat(widthStr, 64)
	height, _ := strconv.ParseFloat(heightStr, 64)
	scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
	
	// TODO: Rectangle インスタンスを作成し、以下にソリューションを実装します
	
	// 初期の面積を出力する
	// fmt.Printf("Initial area: %.0f\n", initialArea) // 出力にはこのフォーマットを使用してください
	
	// 長方形をスケーリングする
	
	// スケーリング後の面積を出力する
	// fmt.Printf("Scaled area: %.0f\n", scaledArea) // 出力にはこのフォーマットを使用してください
}

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