GO语言的最新版本GO 1.24引入了几个重要功能,包括通用类型的别名,弱指针,改进的清洁结尾器等。它还可以在map
默认实现,小对象分配和静音处理中提高运行时性能。
GO中的类型别名为现有类型提供了同义词,这对于可读性和简洁性很有用。现在,GO 1.24允许为通用类型创建类型别名,即类型别名可以指定类型参数。
<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-go"><span style="color:#0077aa">type</span> ComparableVector<span style="color:#999999">[</span>T comparable<span style="color:#999999">]</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">=</span></span> Vector<span style="color:#999999">[</span>T<span style="color:#999999">]</span>
<span style="color:#0077aa">type</span> ComparableVectorOfInts <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">=</span></span> ComparableVector<span style="color:#999999">[</span><span style="color:#669900">int</span><span style="color:#999999">]</span>
<span style="color:#0077aa">type</span> ThisWouldBeAnError <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">=</span></span> ComparableVector<span style="color:#999999">[</span><span style="color:#999999">[</span><span style="color:#999999">]</span><span style="color:#669900">int</span><span style="color:#999999">]</span>
</code></span></span>
值得回想的是,GO提供了类似的语法,用于定义基于现有类型的新类型,例如type NewInt int
。尽管语法仅在丢失中有所不同=
,但含义很大,因为NewInt
无法代替int
。
有趣的是,关于引入通用类型的别名及其对语言的含义的讨论已经进行了三年多。
虚弱的指针不会增加对象的参考计数,因此,仅弱指针引用对象时,垃圾收集器才能释放它。结果,您应该nil
在尝试使用其值之前检查弱指针:
<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-go"><span style="color:#0077aa">var</span> strongInt <span style="color:#669900">int</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">=</span></span> <span style="color:#990055">5</span>
<span style="color:#0077aa">var</span> weakInt <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">*</span></span><span style="color:#669900">int</span>
weakInt <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">=</span></span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">&</span></span>strongInt
<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">...</span></span>
weakInt<span style="color:#999999">.</span><span style="color:#dd4a68">Value</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
</code></span></span>
当您要实现时,弱指针可能会很有用,例如,一个对象缓存,以避免将对象保留,以使其仅包含在缓存中的事实。
当物体收集到垃圾时,GO决赛的目的是清理东西。在进行1.24之前,可以使用[runtime.SetFinalizer](https://tip.golang.org/pkg/runtime#SetFinalizer)
几个警告来完成这一点,包括无法在同一对象上定义多个最终化器,最终化器将无法在参考周期中涉及的对象等方面起作用,等等。为了克服这些限制,GO 1.24提供了一个新的运行时函数,AddCleanup可用于用对象注册清理功能:
<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-go">runtime<span style="color:#999999">.</span><span style="color:#dd4a68">AddCleanup</span><span style="color:#999999">(</span>objPointer<span style="color:#999999">,</span> cleanupFunc<span style="color:#999999">,</span> resourceToCleanUp<span style="color:#999999">)</span>
<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">...</span></span>
<span style="color:#0077aa">func</span> <span style="color:#dd4a68">cleanupFunc</span><span style="color:#999999">(</span>resourceToCleanUp CleanUpArgType<span style="color:#999999">)</span> <span style="color:#999999">{</span>
<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#a67f59">...</span></span>
<span style="color:#999999">}</span>
</code></span></span>
清理机制通过上述最终化器解决了问题。此外,它确保在单独的goroutine中顺序称为所有清理功能。
如前所述,GO 1.24改善了地图的运行时性能。特别是,它采用了Swisstable作为实施的基础map
,并使用并发的哈希(Hash-Trie)进行实施sync.Map
。
使用Swisstable,根据地图中项目的数量和大小,更快地访问和分配了大型地图的速度和分配速度35%,更快的迭代速度和10-60%的迭代。
同样,采用并发的哈希 - 基因使新的实现能够在几乎每个基准测试sync.Map
中击败旧实现。
GO 1.24比这里涵盖的内容包括更多的改进和更改,包括字节和字符串软件包中的新功能,amitzero json标签,目录限制文件系统访问等。虽然发行说明与往常一样,但您可以找到很棒的视频。Reddit用户绿色3732 YouTube频道上的摘要。