Провалы в переключении типов: подробное объяснение
Переключение типов в Go позволяет эффективно обрабатывать значения на основе их конкретных типов. Однако, в отличие от стандартных операторов переключения регистра, провал явно запрещен при переключении типа. Такой выбор дизайна вызывает вопросы о его обосновании.
Понимание причин
Спецификация Go гласит, что «провал» недопустим при переключениях типов. Этот запрет обусловлен несколькими факторами:
Для иллюстрации проблему, рассмотрите следующий код:switch i := x.(type) { регистр интервал: fmt.Printf("%T\n", i) // печатает "int" случай логический: fmt.Printf("%T\n", i) // печатает "bool" провал строка случая: fmt.Printf("%T\n", i) }
Если бы был разрешен провал, неясно, какой тип будет напечатан для строкового регистра. Было бы неоднозначно, должен ли я оставаться логическим значением или стать интерфейсом{}, содержащим как логическое значение, так и строку.
switch i := x.(type) { case int: fmt.Printf("%T\n", i) // prints "int" case bool: fmt.Printf("%T\n", i) // prints "bool" fallthrough case string: fmt.Printf("%T\n", i) }Альтернативные решения
Хотя провал не допускается в переключатели типов, существуют альтернативные способы добиться аналогичного поведения:switch i := x.(type) { регистр bool, строка: если b, ок := i.(bool); хорошо { // b — логическое значение } // i — интерфейс {}, который содержит либо логическое значение, либо строку }
Этот подход позволяет более конкретно обрабатывать различные типы без несоответствия типов или двусмысленности.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3