嵌入结构:何时首选指针
将一个结构嵌入另一个结构时,有两种选择:使用指针或嵌入值。为了指导这个决定,了解规范并考虑每种方法的优点非常重要。
指针与嵌入值
根据 Go 规范,匿名字段(也称为嵌入字段)可以声明为类型名称或指向非接口类型名称的指针。这意味着您可以选择在以下示例中为 Logger 字段使用类型 log.Logger 或指针 *log.Logger:
<code class="go">type Job struct { Command string *log.Logger }</code>
指针的好处
Eric Urban 的文章《Embedding in Go》重点介绍了嵌入指针的优点,简称“embed”通过指针。”其中包括:
指针嵌入示例
<code class="go">type Bitmap struct{ data [4][5]bool } type Renderer struct{ *Bitmap //Embed by pointer on uint8 off uint8 }</code>
在此示例中,渲染器类型通过以下方式嵌入位图指针。这意味着 Renderer 的多个实例可以共享单个 Bitmap 实例并独立自定义其行为。
技术限制
需要注意的是,您不能使用指向指针的指针或作为匿名字段指向接口的指针。这种限制源于这些类型没有方法,这是嵌入的一个关键方面。方法从嵌入类型提升为嵌入类型,允许您直接访问它们。
以上是在 Go 中嵌入结构时:指针还是嵌入值?的详细内容。更多信息请关注PHP中文网其他相关文章!