MST

星途 面试题库

面试题:Go泛型编程中利用空接口处理复杂数据结构

给定一个空接口切片 `[]interface{}`,其中可能包含 `int`、`string` 和自定义结构体类型的数据。在Go的泛型编程基础上,编写一个函数,能够遍历这个切片,对于 `int` 类型数据进行平方运算,对于 `string` 类型数据计算其长度,对于自定义结构体类型(假设结构体有一个 `Count` 字段为 `int` 类型),将 `Count` 字段值翻倍。最后返回处理后的结果。
45.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// 自定义结构体
type CustomStruct struct {
    Count int
}

// 处理函数
func processSlice(data []interface{}) []interface{} {
    result := make([]interface{}, len(data))
    for i, item := range data {
        switch v := item.(type) {
        case int:
            result[i] = v * v
        case string:
            result[i] = len(v)
        case CustomStruct:
            v.Count *= 2
            result[i] = v
        }
    }
    return result
}

你可以使用以下方式调用这个函数:

func main() {
    var data []interface{}
    data = append(data, 2, "hello", CustomStruct{Count: 3})
    result := processSlice(data)
    fmt.Println(result)
}

在上述代码中:

  1. 定义了一个 CustomStruct 结构体,它有一个 int 类型的 Count 字段。
  2. processSlice 函数遍历输入的 interface{} 切片。
    • 使用 switch v := item.(type) 来进行类型断言,判断每个元素的具体类型。
    • 如果是 int 类型,将其平方后存入结果切片。
    • 如果是 string 类型,计算其长度后存入结果切片。
    • 如果是 CustomStruct 类型,将其 Count 字段翻倍后存入结果切片。
  3. main 函数中,创建一个包含不同类型元素的切片,并调用 processSlice 函数,最后打印处理后的结果。

需要注意的是,这里并没有严格使用Go 1.18引入的泛型,因为对于 interface{} 类型的数据,使用类型断言在这种场景下是更合适的做法。如果一定要使用泛型,在Go中也需要针对不同类型分别定义泛型函数,并且由于Go的泛型目前不支持对结构体字段的直接操作(除非通过反射),所以实际使用泛型在这里并不会更简洁。但如果有更具体的需求,也可以进一步优化。