Go - keep it to yourself - Encapsulation and Embedding - methods
Head First Go、 Jay 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
%