MST

星途 面试题库

面试题:Go空接口在复杂嵌套数据结构管理中的类型安全设计

设计一个复杂的嵌套数据结构,例如包含多层嵌套的map,其中部分值类型为空接口,需要存储不同类型的数据。要求实现一个函数,在添加新数据时确保类型安全,避免类型断言失败导致的运行时错误,描述你采用的设计思路并编写相应代码。
44.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用Go语言来实现,因为Go语言对接口和类型系统的支持有助于解决类型安全问题。
  2. 定义一个基础的结构体作为嵌套数据结构的节点,结构体中包含一个空接口字段来存储不同类型的数据。
  3. 使用map[string]interface{}来实现多层嵌套的map结构。
  4. 在添加新数据的函数中,使用类型断言和类型判断来确保类型安全。

代码实现

package main

import (
    "fmt"
)

// 定义嵌套数据结构节点
type Node struct {
    Data interface{}
}

// 添加新数据的函数
func AddData(nestedMap map[string]interface{}, keys []string, value interface{}) error {
    current := nestedMap
    for i, key := range keys {
        if i == len(keys)-1 {
            // 最后一个键,直接赋值
            if _, ok := current[key]; ok {
                return fmt.Errorf("key %s already exists", key)
            }
            current[key] = value
            return nil
        }
        subMap, ok := current[key].(map[string]interface{})
        if!ok {
            newSubMap := make(map[string]interface{})
            current[key] = newSubMap
            current = newSubMap
        } else {
            current = subMap
        }
    }
    return nil
}

func main() {
    nestedMap := make(map[string]interface{})
    keys := []string{"parent", "child", "grandchild"}
    value := "new data"
    err := AddData(nestedMap, keys, value)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("Data added successfully:", nestedMap)
    }
}