登录
首页 >  Golang >  Go问答

泛型:高效地清空数组片段(无操作)

来源:stackoverflow

时间:2024-03-10 10:00:27 273浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《泛型:高效地清空数组片段(无操作)》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我在 struct 中有一个通用数组,该数组保留在周围:

type s[t any] struct { arr [42]t }
var  sint s[int]
var  sstr s[string]

目前,我使用以下 clear 函数在不再需要此数组的切片后清除它们以防止内存泄漏:

func clear[t any](slice []t) {
    var nilt t
    for i := range slice {
        slice[i] = nilt
    }
}

然后我使用如下:

clear(sInt.arr[3:]) // this should be a no-op
clear(sStr.arr[3:]) // this needs to clear

如果 t 是原始类型,我想让 clear 成为无操作;我不介意过时的垃圾值,我只是想在 t 是引用类型时防止内存泄漏。在 go 中,如果不将底层泛型数组更改为切片,这可能吗?

(上下文:这是用于 b 树实现;为了在使用小订单时保持较低的开销 - 并且由于大小在编译时已知 - 我在 structs 中使用数组而不是切片;我不需要值和子节点的指针、容量、长度 - 我只需要每个节点一个小的长度字段)


正确答案


不支持检测“引用”类型。如果确实需要,可以使用类型断言(类型切换)或反射来检测是否需要执行清除操作。

但请注意,go 1.21 添加了一个内置的 clear() 函数,该函数可能使用高度优化的代码来将切片归零。我还相信它对大小为 42 的数组进行清零的速度比使用反射来检测可清除类型的速度要快。

因此,要清除 arr [42]t 类型的数组,只需执行以下操作:

clear(arr[:])

本篇关于《泛型:高效地清空数组片段(无操作)》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>