banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

Golang實戰GPS程序鞏固組合與轉發

title: Golang 經緯度 DMS 解決實際問題
date: 2022-05-30 20:56:00
toc: false
index_img: https://puep.qpic.cn/coral/Q3auHgzwzM4fgQ41VTF2rOU6dDf5z5eHjtKaxyHSNLafiaq6Z9sVjzQ/0
category:

  • Go
    tags:
  • 自動
  • 創建
  • 計算
  • 字串
  • 列印

題目#

請編寫一個程序,使用 gps 結構表示全球定位系統(Global Positioning System,GPS)。這個結構應該由兩個 location 結構和一個 world 結構組成,其中前者用於表示當前位置和目標位置,而後者則用於表示位置所在的世界。

請為 location 類型實現 description 方法,該方法可以返回一個包含名稱、緯度和經度的字串。至於 world 類型實現則參考文章:

{post cid="32"}

提到的 func (w world) distance(p1, p2 location) float64 方法。

請為 gps 類型綁定兩個方法。第一個是 distance 方法,它用於計算當前位置和目標位置之間的距離。第二個是 message 方法,它會以字串形式描述距離目的地還有多少 km。

最後,請創建 rover 結構並將 gps 嵌入其中,然後編寫 main 函數來測試所有功能。請在測試函數中為火星初始化一個全球定位系統,並將它的當前位置設置為布萊德柏利著陸點(-4.5895, 137.4417),而目標位置則設置為愛律西昂平原(4.5, 135.9),然後創建 curiosity 探測器並使用 message 方法列印出相應的信息(該方法將被轉發 gps 類型的同名方法)。

gps.go#

package main

import (
	"fmt"
	"math"
)

type world struct {
	radius float64
}

type location struct {
	name      string
	lat, long float64
}

func (l location) description() string {
	return fmt.Sprintf("%v (%.1f°, %.1f°)", l.name, l.lat, l.long)
}

type gps struct {
	world       world
	current     location
	destination location
}

func (g gps) distance() float64 {
	return g.world.distance(g.current, g.destination)
}

func (g gps) message() string {
	return fmt.Sprintf("%.1f km to %v", g.distance(), g.destination.description())
}

func (w world) distance(p1, p2 location) float64 {
	s1, c1 := math.Sincos(rad(p1.lat))
	s2, c2 := math.Sincos(rad(p2.lat))
	clong := math.Cos(rad(p1.long - p2.long))
	return w.radius * math.Acos(s1*s2+c1*c2*clong)
}

func rad(deg float64) float64 {
	return deg * math.Pi / 180
}

type rover struct {
	gps
}

func main() {
	mars := world{3389.5}
	bradbury := location{"Bradbury Landing", -4.5895, 137.4417}
	elysium := location{"Elysium Planitia", 4.5, 135.9}

	gps := gps{mars, bradbury, elysium}
	curiosity := rover{gps}
	fmt.Println(curiosity.message())
}

總結#

  • 組合是一種將大型結構分解為小型結構並把它們合併在一起的技術。
  • 嵌入使外部結構能夠訪問內部結構的字段。
  • 當類型被嵌入結構之後,它的方法將自動實現轉發。
  • 如果多個嵌入類型具有同名的方法,並且這些方法被程序調用,則 Go 語言將提示命名衝突。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。