Конструкция type switch

Конструкция type switch в Go используется для проверки типа значения, хранящегося в интерфейсе. Она похожа на обычный switch, но в качестве выражения используется утверждение типа. В каждом случае (case) указывается конкретный тип, и выполняется соответствующий блок кода, если значение интерфейса имеет этот тип. Переменная, которая хранит значение интерфейса, может быть повторно использована внутри каждого блока case с уже конкретным типом.

Синтаксис

goswitch v := x.(type) {
case int:
  // v имеет тип int
case string:
  // v имеет тип string
default:
  // v имеет тип интерфейса
}

В данном примере x — это переменная интерфейсного типа. Выражение x.(type) используется внутри switch для проверки типа. Переменная v принимает значение x, но с конкретным типом, указанным в каждом case.

Пример

Давайте проверим тип значения, хранящегося в интерфейсе, и выведем соответствующее сообщение:

gopackage main

import "fmt"

func main() {
  var x interface{} = 42

  switch v := x.(type) {
  case int:
    fmt.Printf("x is int: %d", v)
  case string:
    fmt.Printf("x is string: %s", v)
  default:
    fmt.Println("x is unknown type")
  }
}

Результат выполнения кода:

go"x is int: 42"

Пример

Теперь проверим интерфейс, содержащий значение типа string:

gopackage main

import "fmt"

func main() {
  var x interface{} = "hello"

  switch v := x.(type) {
  case int:
    fmt.Printf("x is int: %d", v)
  case string:
    fmt.Printf("x is string: %s", v)
  default:
    fmt.Println("x is unknown type")
  }
}

Результат выполнения кода:

go"x is string: hello"

Пример

Рассмотрим пример с несколькими типами, включая пользовательский тип и интерфейс:

gopackage main

import "fmt"

type MyInt int

func main() {
  var x interface{} = MyInt(100)

  switch v := x.(type) {
  case int:
    fmt.Println("x is int")
  case MyInt:
    fmt.Println("x is MyInt")
  case interface{}:
    fmt.Println("x is some interface")
  default:
    fmt.Println("x is unknown type")
  }
}

Результат выполнения кода:

go"x is MyInt"

Смотрите также

  • конструкцию type assertion,
    которая проверяет, реализует ли интерфейс конкретный тип
  • понятие пустого интерфейса,
    который может хранить значение любого типа
  • конструкцию comma-ok,
    которая безопасно проверяет тип интерфейса
  • интерфейс fmt.Stringer,
    который используется для строкового представления типов