Смотри, переменная - это то, к чему можно обратиться по имени.
var x string
- это переменная с именем x
А что такое len(x)
? Это - некоторое значение, которое по ходу дела вычисляют.
Как вычисляют? Да вот вызывая len(x)
и вычисляют.
Где оно находится? Нигде, его лишь можно передать куда-то для сохранения или дальнейших вычислений.
Как его можно сохранить? Присвоив какой-то переменной, например sz := len(x)
.
Но в этот момент эта переменная начинает жить своей жизнью и больше уже не зависит от строки x
, которую можно поменять.
Вычисляя выражения, ты можешь делать что угодно, в том числе преобразование типов, как в твоём вопросе.
Это безопасно, ведь выражение - вот оно, прямо перед тобой записано, всё наглядно.
Присваивая значение переменой, ты можешь - ... ну тут в разных языках по-разному.
В языках с динамической типизацией ты можешь присвоить ей зачение любого типа - и в этом есть опасность. Ты можешь просто не видеть или не знать, что где-то в другом куске кода кто-то что-то туда запихнул. Статическая типизация от этого защищает.
Вообще-то и в языке со статической типизацией есть подобная опасность - где-то кто-то запихнул в переменную значение правильного типа, но невалидное, например ноль в знаменатель дроби. Поэтому изобретены языки, которые обходятся без переменных, одними лишь выражениями. Но это - уже другая история.