開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
入門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 コメント:
コメントを投稿