0
点赞
收藏
分享

微信扫一扫

kubebuilder中资源GET与List时深拷贝问题

kubebuilder中资源GET与List时深拷贝问题

总结,kubebuilder中的资源采用指针的形式进行存储,所以需要在获取后进行深拷贝操作。

在cache配置中,有这样一个参数

UnsafeDisableDeepCopyByObject DisableDeepCopyByObject
type DisableDeepCopyByObject map[client.Object]bool

它的作用是,当我们在GET或List时,对于从缓存中获取的资源对象是否进行深拷贝操作。默认为进行深拷贝

为什么要进行深拷贝操作那?让我们猜想一下,深拷贝的目的为防止新值的变动影响旧值,并且这个问题一般出现在引用对象当中,那么是不是kubebuilder中的资源都是采用指针的模式进行存储的那?下面让我们开始验证。

// threadSafeMap implements ThreadSafeStore
type threadSafeMap struct {
	lock  sync.RWMutex
	items map[string]interface{}

	// indexers maps a name to an IndexFunc
	indexers Indexers
	// indices maps a name to an Index
	indices Indices
}

该结构体就是对资源进行缓存,我们可以看到它的本质就是map对象,值为interface。

在进行下面的讲解之前我们说一下interface,interface分为两种类型,一种是有方法,一种无方法,其结构大致为type,data。在方法中,对象作为参数时,会调用convT2I类似的方法对数据进行处理,而这一步操作属于值复制,那么也就是说go中所有方法都是采用的值传参形式。

当资源监听被触发时,会对服务器传来的数据以指针结构体形式进行解析,然后放入事件队列当中。

举报

相关推荐

0 条评论