Есть ли ошибка в утверждениях Go Spec Type?
Утверждение типа, используемое в операторе присваивания или инициализации специальной формы.
v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T) var v, ok interface{} = x.(T) // dynamic types of v and ok are T and bool
дает дополнительное нетипизированное логическое значение.
Что последний пример должен быть и означать?
var v, ok interface{} = x.(T)
?
Я получаю сообщение об ошибке в Go 1.19
syntax error: unexpected interface, expecting := or = or comma
Все эти строки пытаются выполнить одну и ту же операцию: утверждение типа x
для ввода T
. Значение ok
определяет, было ли утверждение успешным. В последнем приведенном вами примере единственное отличие состоит в том, что вместо того, чтобы Go определял тип для v
и ok
, вы указали тип interface{}
для обоих. Объявление v
и ok
как interface{}
не меняет содержащихся в них значений. Это позволит вам отправлять их в функции или добавлять в коллекции, которые ожидают тип interface{}
, после чего их нужно будет снова утверждать.
Ах, это объявление var (как interface{}), а также присваивание. Спасибо. Однако он не компилируется - syntax error: unexpected interface, expecting := or = or comma
В Go нет «приведения» или «приведения типов», это утверждения типов, которые отличаются от того, как большинство языков определяют приведение типов.
@Zaphod, он компилируется, у тебя где-то опечатка. go.dev/play/p/sjrx1tmOEXl
@JimB Извините, мой язык был неточным. Именно это я имел в виду. Я изменил ответ, чтобы использовать правильные слова.
"Есть ли ошибка в спецификации?" Если у вас возникает такой вопрос: Спросите себя, насколько вероятно, что вы первым заметили эту ошибку. Тогда внимательно ищите опечатки в коде.