面试题答案
一键面试- 使用Go语言空接口实现缓存基本结构
package main
import (
"fmt"
)
// Cache 定义缓存结构
type Cache struct {
data map[string]interface{}
}
// NewCache 创建新的缓存实例
func NewCache() *Cache {
return &Cache{
data: make(map[string]interface{}),
}
}
// Set 设置缓存值
func (c *Cache) Set(key string, value interface{}) {
c.data[key] = value
}
// Get 获取缓存值
func (c *Cache) Get(key string) (interface{}, bool) {
value, exists := c.data[key]
return value, exists
}
- 高效处理空接口类型数据的读写及避免类型断言错误
- 类型断言前检查存在性:在进行类型断言之前,先通过
Get
方法检查数据是否存在于缓存中。如上述代码中的Get
方法返回了一个布尔值exists
,通过检查它来确保后续的类型断言是有意义的,避免对不存在的数据进行类型断言。 - 使用类型断言的comma-ok形式:当需要从缓存中取出特定类型的数据时,使用comma-ok形式的类型断言。例如:
- 类型断言前检查存在性:在进行类型断言之前,先通过
func main() {
cache := NewCache()
cache.Set("number", 123)
value, exists := cache.Get("number")
if exists {
if num, ok := value.(int); ok {
fmt.Printf("The number is: %d\n", num)
} else {
fmt.Println("Expected an int, but got a different type")
}
} else {
fmt.Println("Key not found in cache")
}
}
- **使用类型开关(Type Switch)**:如果需要根据不同类型进行不同处理,可以使用类型开关。例如:
func handleValue(value interface{}) {
switch v := value.(type) {
case int:
fmt.Printf("It's an int: %d\n", v)
case string:
fmt.Printf("It's a string: %s\n", v)
default:
fmt.Println("Unknown type")
}
}
这样可以避免在不知道具体类型的情况下进行盲目的类型断言,提高代码的健壮性。