2020年2月8日土曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 5(状態と振る舞い)、LESSON 24(インターフェース)のクイックチェック24-3と練習問題の解答を求めてみる。

コード

package main

import (
 "encoding/json"
 "fmt"
 "os"
 "strings"
)

type coordinate struct {
 d, m, s float64
 h       rune
}

func (c coordinate) String() string {
 return fmt.Sprintf(`%v°%v'%.1f" %v`, c.d, c.m, c.s, strings.ToUpper(string(c.h)))
}
func (c coordinate) decimal() float64 {
 var sign float64
 switch c.h {
 case 'N', 'E', 'n', 'e':
  sign = 1.0
 default:
  sign = -1.0
 }
 return sign * (c.d + c.m/60 + c.s/3600)
}
func (c coordinate) MarshalJSON() ([]byte, error) {
 t := struct {
  Decimal float64 `json:"decimal"`
  Dms     string  `json:"dms"`
  M       float64 `json:"minutes"`
  S       float64 `json:"seconds"`
  H       string  `json:"hemisphere"`
 }{
  c.decimal(),
  c.String(),
  c.m,
  c.s,
  strings.ToUpper(string(c.h)),
 }
 return json.Marshal(t)
}
func main() {
 c := coordinate{d: 135, m: 54, s: 0, h: 'E'}
 fmt.Println(c)
 fmt.Println(strings.Repeat("-", 50))

 b, err := json.Marshal(c)
 if err != nil {
  fmt.Fprintln(os.Stderr, err)
  os.Exit(1)
 }
 fmt.Println(string(b))
 fmt.Println(strings.Repeat("-", 50))

 b, err = json.MarshalIndent(c, "", "    ")
 if err != nil {
  fmt.Fprintln(os.Stderr, err)
  os.Exit(1)
 }
 fmt.Println(string(b))
 fmt.Println(strings.Repeat("-", 50))

 b, err = json.MarshalIndent(c, ">", "    ")
 if err != nil {
  fmt.Fprintln(os.Stderr, err)
  os.Exit(1)
 }
 fmt.Println(string(b))
}

入出力結果(Zsh、PowerShell、Terminal)

% go run ./marshal.go
135°54'0.0" E
--------------------------------------------------
{"decimal":135.9,"dms":"135°54'0.0\" E","minutes":54,"seconds":0,"hemisphere":"E"}
--------------------------------------------------
{
    "decimal": 135.9,
    "dms": "135°54'0.0\" E",
    "minutes": 54,
    "seconds": 0,
    "hemisphere": "E"
}
--------------------------------------------------
{
>    "decimal": 135.9,
>    "dms": "135°54'0.0\" E",
>    "minutes": 54,
>    "seconds": 0,
>    "hemisphere": "E"
>}
%

0 コメント:

コメントを投稿