gpt4 book ai didi

Golang - 将 "inheritance"添加到结构

转载 作者:IT王子 更新时间:2023-10-29 02:04:00 24 4
gpt4 key购买 nike

我想优化我的代码,我有以下情况:

我有一个通用的struct,其中只有一个字段给出了规范,比如说一个缓存结构示例:

# the main cache struct
type Cache struct {
name string
memory_cache map[string]interface{}
mutex *sync.Mutex
... ...
# common fields
}

# an element stored in the Cache.memory_cache map
type ElementA {
name string
count int64
}

# an element stored in the Cache.memory_cache map
type ElementB {
name string
tags []string
}

我当前的解决方案遵循之前的定义,我为每个元素创建一个缓存(必须是这样:每个元素一个缓存):

var cache_for_element_A Cache{}
var cache_for_element_B Cache{}

但是这样一来,即使我已经知道内容是什么,我也必须在阅读时始终强制转换memory_cache(这样就不需要强制转换了)。


下面的代码做了我想要的,但是它定义了很多冗余/公共(public)字段的两倍,因此我想找到另一个解决方案。

type CacheForA struct {
name string
memory_cache map[string]ElementA{}
mutex *sync.Mutex
... ...
# common fields
}

type CacheForB struct {
name string
memory_cache map[string]ElementB{}
mutex *sync.Mutex
... ...
# common fields
}

那么,是否可以在结构体中定义一个字段(更准确地说是 Cache.memory_cache),可以在声明发生时进一步定义而不使用 interface

最佳答案

Go 没有泛型,因此没有简单的方法可以做到这一点,例如在 Java 中(class Cache<T>()....)。

您可以做的一件事是用一个小的类型化函数包装您的缓存,该函数只从通用缓存中获取对象并将接口(interface)转换为正确的类型。这只是让您免于在代码中一遍又一遍地编写接口(interface)转换。

type ElemACache struct { 
Cache
}

func (c *ElemeACache)Get(key string) ElemeA {
return c.Cache.Get(key).(ElemeA) //of course add checks here
}

关于Golang - 将 "inheritance"添加到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39594229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com