MST

星途 面试题库

面试题:Go中接口声明边界情况之空接口使用

在Go语言中,空接口可以用来表示任何类型的值。请编写一段代码,展示如何将不同类型的数据(如整数、字符串、结构体)存储到一个切片中,该切片的元素类型为空接口,并遍历这个切片,打印出每个元素的类型和值。同时说明在这种场景下可能遇到的边界情况以及如何处理。
12.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

type MyStruct struct {
    Name string
}

func main() {
    var data []interface{}
    data = append(data, 10)
    data = append(data, "hello")
    data = append(data, MyStruct{Name: "example"})

    for _, item := range data {
        switch v := item.(type) {
        case int:
            fmt.Printf("Type: int, Value: %d\n", v)
        case string:
            fmt.Printf("Type: string, Value: %s\n", v)
        case MyStruct:
            fmt.Printf("Type: MyStruct, Value: %+v\n", v)
        default:
            fmt.Printf("Unknown type\n")
        }
    }
}

边界情况及处理

  1. 类型断言失败:如果在switch v := item.(type)语句中没有涵盖所有可能的类型,在运行时访问未处理类型时,default分支会被执行,打印Unknown type。为避免这种情况,需要尽可能全面地列出可能的类型。
  2. 结构体内部的空接口类型:如果结构体内部存在空接口类型字段,在处理时可能需要递归处理。可以通过递归函数来处理结构体的各个字段。
  3. 性能问题:使用空接口和类型断言会带来一定的性能开销。在性能敏感的场景下,应尽量避免频繁使用这种方式,或者通过缓存类型断言的结果等方式优化性能。