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