@Arthaus25

В Go – динамическая типизация?

В учебнике Докси написано, то в Go типизация статическая (впрочем, так написано везде). Я, как нуб, понял это так: если я задаю
var x string

то тип переменной нельзя будет изменить.

И позже Докси пишет:
fmt.Println(total / float64(len(x)))

то есть, как я понял, изменяет тип... ну, хорошо, не переменной, а, в данном случае, массива.

Но тогда я не понимаю в чём смысл "статической типизации". Можете развеять заблуждения по поводу динамической типизации в Go или самой сути статической?
  • Вопрос задан
  • 3171 просмотр
Решения вопроса 2
longclaps
@longclaps
Смотри, переменная - это то, к чему можно обратиться по имени.
var x string - это переменная с именем x
А что такое len(x)? Это - некоторое значение, которое по ходу дела вычисляют.
Как вычисляют? Да вот вызывая len(x) и вычисляют.
Где оно находится? Нигде, его лишь можно передать куда-то для сохранения или дальнейших вычислений.
Как его можно сохранить? Присвоив какой-то переменной, например sz := len(x).
Но в этот момент эта переменная начинает жить своей жизнью и больше уже не зависит от строки x, которую можно поменять.
Вычисляя выражения, ты можешь делать что угодно, в том числе преобразование типов, как в твоём вопросе.
Это безопасно, ведь выражение - вот оно, прямо перед тобой записано, всё наглядно.
Присваивая значение переменой, ты можешь - ... ну тут в разных языках по-разному.
В языках с динамической типизацией ты можешь присвоить ей зачение любого типа - и в этом есть опасность. Ты можешь просто не видеть или не знать, что где-то в другом куске кода кто-то что-то туда запихнул. Статическая типизация от этого защищает.
Вообще-то и в языке со статической типизацией есть подобная опасность - где-то кто-то запихнул в переменную значение правильного типа, но невалидное, например ноль в знаменатель дроби. Поэтому изобретены языки, которые обходятся без переменных, одними лишь выражениями. Но это - уже другая история.
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
Go использует так называемую структурную типизацию (калька со structural typing).
Также Go использует индентичность типов https://golang.org/ref/spec#Type_identity т.е. проверяются типы.

Вот иллюстрация работы типов в Go:
5a4c2680cc679404929431.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы