計算機科学のブログ

Go - keep it to yourself - Encapsulation and Embedding - methods

Head First GoJay McGavren(著)、O’Reilly Media)の Chapter 10(keep it to yourself - Encapsulation and Embedding)、p.314(Exercise)の解答を求めてみる。

コード

main.go

package main

import (
	"fmt"
	"geo/geo"
	"log"
)

func main() {
	location := geo.Landmark{}
	err := location.SetName("The Googleplex")
	if err != nil {
		log.Fatal(err)
	}
	err = location.SetLatitude(37.42)
	if err != nil {
		log.Fatal(err)
	}
	err = location.SetLongitude(-122.08)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(location.Name())
	fmt.Println(location.Latitude())
	fmt.Println(location.Longitude())
}

geo/geo.go

package geo

import "errors"

type Coordinates struct {
	latitude  float64
	longitude float64
}

func (c *Coordinates) Latitude() float64 {
	return c.latitude
}
func (c *Coordinates) Longitude() float64 {
	return c.longitude
}
func (c *Coordinates) SetLatitude(latitude float64) error {
	if latitude < -90 || latitude > 90 {
		return errors.New("invalid latitude")
	}
	c.latitude = latitude
	return nil
}
func (c *Coordinates) SetLongitude(longitude float64) error {
	if longitude < -180 || longitude > 180 {
		return errors.New("invalid longitude")
	}
	c.longitude = longitude
	return nil
}

geo/landmark.go

package geo

import "errors"

type Landmark struct {
	name string
	Coordinates
}

func (l *Landmark) Name() string {
	return l.name
}
func (l *Landmark) SetName(name string) error {
	if name == "" {
		return errors.New("invalid name")
	}
	l.name = name
	return nil
}

入出力結果(Terminal, Zsh)

% go run ./main.go 
The Googleplex
37.42
-122.08
% cat go.mod 
module geo

go 1.23.4
%