嵌入:何时使用指针与值引用
在 Golang 中将一个结构合并到另一个结构中时,需要选择使用指针或值引用。考虑以下代码片段:
<code class="go">type Job struct { Command string *log.Logger }</code>
在此示例中,我们在 Job 结构中嵌入了 *log.Logger 类型(由指针表示)。或者,我们可以使用如下的值引用:
<code class="go">type Job struct { Command string log.Logger }</code>
虽然两种方法都实现了嵌入,但它们的含义不同。根据 Go 规范,嵌入字段支持类型本身或指向非接口类型的指针。至关重要的是,嵌入类型不能是指针类型。
嵌入指针(称为“按指针嵌入”)具有特定的优势。首先,它允许利用遵循 NewX 模式的函数,其中结构通过引用初始化和返回。其次,它支持在运行时将不同实例动态分配给嵌入类型。
例如,考虑以下代码:
<code class="go">type Bitmap struct{ data [4][5]bool } type Renderer struct{ *Bitmap //Embed by pointer on uint8 off uint8 }</code>
在此示例中,Renderer 类型通过以下方式嵌入 Bitmap:参考。这允许 Bitmap 的单个实例充当多个 Renderer 实例的嵌入实例,每个实例都有其唯一的字符集。此代码的输出演示了多个渲染器如何在同一底层数据结构上进行操作。
OXXO OXOO OXOO OXOO .@@. .@.. .@.. .@..
相比之下,嵌入值引用并不能提供这些优势。但是,它不需要实例化嵌入类型来访问其方法。最终,使用指针还是值引用的决定取决于应用程序的具体要求以及嵌入字段所需的行为。
以上是Go 中的嵌入式字段何时使用指针与值引用?的详细内容。更多信息请关注PHP中文网其他相关文章!