«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему Fallthrough запрещен при переключении типа Go?

Почему Fallthrough запрещен при переключении типа Go?

Опубликовано 17 ноября 2024 г.
Просматривать:988

Why is Fallthrough Disallowed in Go's Type Switch?

Провалы в переключении типов: подробное объяснение

Переключение типов в 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