Проверяет понимание пустого интерфейса в Go, который является фундаментальной концепцией для работы с динамической типизацией и обобщённым кодом.
Пустой интерфейс (interface{}) в Go — это специальный тип, который не содержит ни одного метода. Поскольку любой тип в Go реализует пустой интерфейс (ведь для этого не нужно реализовывать методы), переменная типа interface{} может хранить значение любого типа: int, string, структуру, срез и так далее. Это аналог void* в C или Object в Java, но с безопасностью типов на этапе выполнения.
Когда вы присваиваете значение переменной типа interface{}, Go сохраняет как само значение, так и информацию о его исходном типе. Чтобы вернуться к конкретному типу, используется утверждение типа (type assertion) или переключатель типа (type switch).
package main
import "fmt"
func describe(i interface{}) {
fmt.Printf("Value: %v, Type: %T\n", i, i)
}
func main() {
var x interface{}
x = 42
describe(x) // Value: 42, Type: int
x = "hello"
describe(x) // Value: hello, Type: string
// Type assertion
str, ok := x.(string)
if ok {
fmt.Println("String length:", len(str))
}
// Type switch
switch v := x.(type) {
case int:
fmt.Println("Integer:", v)
case string:
fmt.Println("String:", v)
default:
fmt.Println("Unknown type")
}
}Пустой интерфейс — мощный инструмент для создания гибкого и переиспользуемого кода в Go, но его следует использовать с осторожностью, так как он обходит систему статической типизации. Применяйте его, когда тип данных действительно неизвестен на этапе компиляции, и всегда проверяйте типы через утверждение или переключатель, чтобы избежать паники.