Как приводить пустые интерфейсы в go к разным типам?

Пользователь

от forest , в категории: Golang , год назад

Как приводить пустые интерфейсы в go к разным типам?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от fidel , год назад

@forest 

В Go, пустой интерфейс (англ. "empty interface") - это интерфейс, который не имеет методов. Пустой интерфейс может хранить значения любого типа, поскольку любой тип в Go удовлетворяет пустому интерфейсу.


Чтобы привести пустой интерфейс к определенному типу, можно использовать операцию приведения типа (англ. "type assertion"). Операция приведения типа возвращает значение и логическое значение, указывающее, было ли приведение типа успешным.


Пример использования операции приведения типа:

1
2
3
4
5
6
7
var i interface{} = 42
j, ok := i.(int)
if ok {
    fmt.Println(j)
} else {
    fmt.Println("Приведение типа не удалось")
}


В этом примере мы создаем пустой интерфейс i и присваиваем ему значение типа int. Затем мы используем операцию приведения типа i.(int), чтобы привести i к типу int. Если приведение типа успешно, значение j будет содержать значение типа int, и переменная ok будет равна true. Если приведение типа не удалось, значение j будет нулевым, и переменная ok будет равна false.


Можно использовать также синтаксис без второго значения, чтобы выбросить панику, если приведение не удалось:

1
2
var i interface{} = "hello"
j := i.(int) // выбросит панику: интерфейс содержит строку, а не целое число


Также можно использовать операцию switch для проверки типа значения пустого интерфейса и выполнения соответствующих действий:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var i interface{} = 3.14
switch v := i.(type) {
case int:
    fmt.Println("Это целое число")
case float64:
    fmt.Println("Это число с плавающей точкой")
default:
    fmt.Printf("Неизвестный тип %T
", v)
}


В этом примере мы используем операцию switch для проверки типа значения i и выполнения соответствующих действий в зависимости от типа. Если значение i содержит int, будет выведено сообщение "Это целое число". Если значение i содержит float64, будет выведено сообщение "Это число с плавающей точкой". Если значение i содержит другой тип, будет выведено сообщение "Неизвестный тип %T", где %T заменяется на тип значения v.