MST

星途 面试题库

面试题:Go自定义类型跨包使用的边界情况处理

假设你在一个Go项目中有两个包`packageA`和`packageB`。在`packageA`中定义了一个自定义类型`type CustomType struct { InnerData map[string]interface{} }`,在`packageB`中需要使用这个类型。在使用过程中,涉及到`InnerData`为空map(一种边界情况)以及并发访问该map的边界情况,如何设计合理的方法来处理这些边界情况,保证数据的一致性和安全性,同时还要考虑跨包使用时的可维护性和扩展性。请详细阐述设计思路并给出关键代码片段。
17.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 处理空 map 情况:在packageA中提供初始化CustomType的方法,确保InnerData在使用前被正确初始化,避免空指针异常。
  2. 并发访问处理:使用sync.RWMutex来保护InnerData,读操作使用读锁,写操作使用写锁,以保证数据一致性和安全性。
  3. 跨包使用的可维护性和扩展性:将对CustomType的操作封装成方法,在packageA中提供统一的接口,这样在packageB使用时只需要调用这些接口,而不需要直接操作InnerData,提高可维护性和扩展性。

关键代码片段

packageA

package packageA

import (
    "sync"
)

type CustomType struct {
    InnerData map[string]interface{}
    mu        sync.RWMutex
}

// NewCustomType 创建一个新的 CustomType 实例,并初始化 InnerData
func NewCustomType() *CustomType {
    return &CustomType{
        InnerData: make(map[string]interface{}),
    }
}

// Get 获取 InnerData 中的值
func (ct *CustomType) Get(key string) (interface{}, bool) {
    ct.mu.RLock()
    defer ct.mu.RUnlock()
    value, exists := ct.InnerData[key]
    return value, exists
}

// Set 设置 InnerData 中的值
func (ct *CustomType) Set(key string, value interface{}) {
    ct.mu.Lock()
    defer ct.mu.Unlock()
    if ct.InnerData == nil {
        ct.InnerData = make(map[string]interface{})
    }
    ct.InnerData[key] = value
}

packageB

package packageB

import (
    "fmt"
    "your_project_path/packageA"
)

func UseCustomType() {
    custom := packageA.NewCustomType()
    custom.Set("key1", "value1")
    value, exists := custom.Get("key1")
    if exists {
        fmt.Printf("Value for key1: %v\n", value)
    }
}