当前位置: 首页 > 面试题库 >

嵌入何时使用指针

百里渊
2023-03-14
问题内容

当我想将一个结构嵌入另一个结构中时,应该使用指针还是值?

例如

type Job struct {
    Command string
    *log.Logger
}

要么

type Job struct {
    Command string
    log.Logger
}

问题答案:

您可以使用其中之一:对于struct type,规范中提到:

使用类型但没有显式字段名称声明的字段是 匿名 字段,也称为 嵌入 字段或该类型在结构中的嵌入。

必须将嵌入式类型指定为类型名称T或指向非接口类型名称的指针*T,并且T本身不能为指针类型。

既然log.Logger不是
一个接口,可以使用类型或指针为匿名字段的类型Logger

Eric
Urban(
)的文章“
Embeding in Go ”
将嵌入指针称为“ embed by-pointer ”:hydrogen18

  • 这样做的第一个优点是,您可以依靠使用该NewX惯用语返回结构按指针的函数来进行初始化。
  • 第二个优点是, 您可以嵌入类型的所有功能,而无需知道何时实例化它
    指向a的嵌入式指针与BitmapGo中的任何其他指针没有什么不同,因此可以多次分配它。
    这样,您可以更改在运行时动态扩展的实例。

例如,使用:

type Bitmap struct{
    data [4][5]bool
}

type Renderer struct{
    *Bitmap //Embed by pointer
    on uint8
    off uint8
}

Renderer类型嵌入一个Bitmap按指针。

的一个实例Bitmap可以充当许多Renderer实例的嵌入式实例:

var renderA,renderB Renderer
renderA.on = 'X'
renderA.off = 'O'
renderB.on = '@'
renderB.off = '.'

var pic Bitmap
pic.data[0][6] = true
pic.data[0][7] = true
pic.data[1][8] = true
pic.data[2][9] = true
pic.data[3][10] = true

renderA.Bitmap = &pic
renderB.Bitmap = &pic

renderA.render()
renderB.render()

这将相同的Bitmap实例共享给两个不同的渲染器。
每个渲染器都有其自己的字符集,允许打印位图的两种表示形式。
输出如下所示:

OXXO
OXOO
OXOO
OXOO
.@@.
.@..
.@..
.@..

本示例演示了Flyweight模式。
尽管在此示例中与内存消耗无关紧要,但具有成千上万个实例共享单个基础数据结构对于减少系统的内存消耗可能非常重要。

如本线程所述:

之所以没有指针和指向接口匿名字段的指针,是因为这些类型没有方法。
匿名字段的全部要点是方法得到了推广

我已经解释了为什么接口没有方法:很多人错误地和不必要地使用了指向接口的指针,并且没有任何已知的有效用法,因此更改了语言,以通过使指向接口的指针具有没有办法。



 类似资料:
  • 问题内容: 我可以使用指针和值嵌入golang中。通过指针 按价值 通过指针或值更喜欢什么? 问题答案: 这取决于。这里有几种可能性。 如果Renderer按值传递,并且在 Bitmap上定义了Bitmap所需的方法,则需要嵌入 Bitmap。 如果将Renderer作为指针传递,则可以将Bitmap作为值嵌入而没有任何问题(在这种情况下仍可以访问指针方法)。 如果Bitmap具有返回指针的构造函

  • 把一种编程语言嵌入到一个系统对程序员来讲有着几乎与性一样的魔力。这是一种最具有创造力的可以表现的行为。这使得系统惊人地强大。这也允许你锻炼大多数创造性和有生命力的能力,把系统变成你的朋友。 世界上最好的文本编辑器都有嵌入性语言。这可以被用于预计的观众可以掌握的语言的范围,语言的使用可以变为可选的,正如文本编辑器里那样,这样在一开始可以使用它,而没有其他人必须使用它。 我和许多其他的程序员曾坠入创造

  • 我正在寻找HAL中嵌套_embedded如何使用Spring HATEOAS API编程的例子。最佳实践是什么? 下面是我想要实现的一个例子:

  • 问题内容: 我很困惑何时选择存储过程而不是代码中的嵌入式SQL 当我用谷歌搜索时,我发现了这些要点 它们允许模块化编程。 它们可以减少网络流量。 它们可以用作安全机制。 请告诉我网络流量与之有何关系? 问题答案: 他们可以通过仅将所需的数据返回给客户端来减少网络流量。 或扭转它;浪费网络流量的一种设计/编码实践是从数据库中选择一组数据,将其返回给客户端,然后在其中对某些数据集进行处理。显然,如果您

  • 我正在努力使用datadog导入指标...尽管安装了所有必需的包,但我还是低于错误...(-实例#0[错误]:异常('您需要“psutil”包来运行此检查',) 请你在这里帮助我,因为这被证明是一个主要的障碍。 [root@mudcsftpup01初始化。d] #/数据狗代理信息 状态日期:2017-08-31 11:31:19(1秒前)Pid:32028平台:Linux-3.10.0-514。e