Нет, вы не можете избежать отбрасывания своего расстояния и времени обратно в поплавки, поскольку для этих типов разделение не определено. И, как было сказано ранее, Go строго типизирован.
Итак, в вашем случае вам придется прикладывать броски повсюду (не очень хорошая идея). Тип aliasing хорош, если вы хотите писать собственные методы для своих типов, но его цель заключается не только в скрытии базового типа под пользовательским.
Однако не все типы работают таким образом. Если вы сделаете псевдоним карты, вы можете без проблем вызвать операторы скобок.
type Map map[string]string
func main() {
m := Map(make(map[string]string))
m["answer"] = "42"
fmt.Printf("m's type is %T and answer is %s\n", m, m["answer"])
//
// m's type is main.Map and answer is 42
}
Кроме того, при инициализации пользовательских псевдонимов, литье ненужно:
type Speed float64
type Distance float64
func main() {
var s Distance = 123.0
var t Time = 300
// ...
}
компилируется и работает отлично. Что происходит за сценой, так это то, что буква 123.0
считается нетипизированным поплавком, а 300
считается нетипизированным int.
Я знаю, это звучит странно, но в основном эти значения не печатаются, поэтому Go пытается поместить их в тип слева. Вот почему вы можете написать var f float64 = 1
, хотя 1
не является поплавком. Но вы не можете написать var f float64 = int(1)
, потому что 1 становится типизированным int, который не может быть переведен в float64
.
Поэтому следующий не будет работать:
func main() {
var distance float64 = 123.0
var time float64 = 300
var s Distance = distance
var t Time = time
// ...
}
Нет, но, но что-то вроде этого, я не думаю, что есть веские основания, чтобы не просто использовать float64, если вы не определения каких-либо методов , – JimB
Причина (для меня) проста: я хочу убедиться, что мы работаем на правильном типе, и complier спасет меня от написания множества спецификаций. –
Это _is_ оптимально. – Volker