面试题答案
一键面试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)
}
在上述代码中:
- 定义了一个
CustomStruct
结构体,它有一个int
类型的Count
字段。 processSlice
函数遍历输入的interface{}
切片。- 使用
switch v := item.(type)
来进行类型断言,判断每个元素的具体类型。 - 如果是
int
类型,将其平方后存入结果切片。 - 如果是
string
类型,计算其长度后存入结果切片。 - 如果是
CustomStruct
类型,将其Count
字段翻倍后存入结果切片。
- 使用
- 在
main
函数中,创建一个包含不同类型元素的切片,并调用processSlice
函数,最后打印处理后的结果。
需要注意的是,这里并没有严格使用Go 1.18引入的泛型,因为对于 interface{}
类型的数据,使用类型断言在这种场景下是更合适的做法。如果一定要使用泛型,在Go中也需要针对不同类型分别定义泛型函数,并且由于Go的泛型目前不支持对结构体字段的直接操作(除非通过反射),所以实际使用泛型在这里并不会更简洁。但如果有更具体的需求,也可以进一步优化。