まとめ:構造体の振る舞い
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 11/68。
チャレンジ
簡単このチャレンジでは、シンプルな長方形管理システムを作成することで、値レシーバとポインタレシーバの両方の実装を練習します。Rectangle 構造体を作成し、それぞれのレシーバタイプをいつ使用すべきかを示す2つの異なるタイプのメソッドを定義します。
3つの入力を受け取ります:
- 長方形の幅を表す文字列 (例:
"5.0") - 長方形の高さを表す文字列 (例:
"3.0") - スケーリング係数を表す文字列 (例:
"2.0")
あなたのタスクは以下の通りです:
- 2つのフィールド
Width(float64) とHeight(float64) を持つRectangle構造体を定義する - 長方形の面積(幅 × 高さ)を計算して返す、値レシーバを持つ
areaという名前のメソッドを作成する - 与えられたスケーリング係数を幅と高さの両方に掛ける、ポインタレシーバを持つ
scaleという名前のメソッドを作成する - 入力をパースして
Rectangleインスタンスを作成する "Initial area: [area]"という形式を使用して、初期の面積を出力する- スケーリング係数を使用して
scaleメソッドを呼び出す "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) // 出力にはこのフォーマットを使用してください
}