Рассмотрим этот код:Почему golang запрещает присвоение одному и тому же базовому типу, если он является родным?
package main
import "fmt"
type specialString string
func printString(s string) {
fmt.Println(s)
}
// unlike, say, C++, this is not legal GO, because it redeclares printString
//func printString(s specialString) {
// fmt.Println("Special: " + s)
//}
func main() {
ss := specialString("cheese")
// ... so then why shouldn't this be allowed?
printString(ss)
}
Мой вопрос: почему это язык определяется так, что вызов printString(ss)
в main()
не допускается? (Я не ищу ответы, которые указывают на правила Golang при назначении, я их уже прочитал, и я вижу, что как specialString, так и строка имеют один и тот же «базовый тип», и оба типа называются «named» - если вы считаете типичный тип «строка», который, по-видимому, делает Голанг, и поэтому они не могут быть назначены по правилам.)
Но Почему - это правила? Какую проблему решают, рассматривая встроенные типы как «именованные» типы и не позволяя вам передавать именованные типы ко всем стандартным библиотечным функциям, которые принимают тот же базовый встроенный тип? Кто-нибудь знает, о чем здесь говорили разработчики языка?
С моей точки зрения, это, кажется, создает много преобразования бессмысленного типа в коде, и отпугивает использование сильной типизации, когда он на самом деле будет иметь смысл ..
Только по соображениям безопасности. Сильная строгая типизация делает ошибки менее вероятными. В вашем примере, где вы используете «специальную строку», подразумевается, что это строка, и можно получить впечатление от подтипирования, которое Go не имеет. Вы вводите строку типа foobar для foobar (которая фактически является строкой), но почему имеет смысл напечатать foobar с помощью функции printstring? Foobar не 'string', это foobar. Если простая строка - это все, что вам нужно, тогда нет необходимости вводить «специальную строку», просто используйте обычную строку. – Volker
Также вы найдете еще несколько аргументов в официальном FAQ: [Почему Go не предоставляет неявные числовые преобразования?] (Http://golang.org/doc/faq#conversions) – icza
Также рассмотрим дизайн частей библиотеки, таких как ' time.Duration'. Язык запрещает «int64's» обрабатывать как «time.Duration» без учета элементов expliclt. Функция, которую вы критикуете, может (и есть!) Использоваться для кодирования правила «тех же единиц», которое мы знаем из средней школы. При использовании хорошо, это должно затруднить совершение тех же самых ошибок, которые посылают спутники с неба из-за ошибки преобразования метрики. – dyoo