您可以使用其中之一:对于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 RendererrenderA.on = 'X'renderA.off = 'O'renderB.on = '@'renderB.off = '.'var pic Bitmappic.data[0][6] = truepic.data[0][7] = truepic.data[1][8] = truepic.data[2][9] = truepic.data[3][10] = truerenderA.Bitmap = &picrenderB.Bitmap = &picrenderA.render()renderB.render()
这将相同的
Bitmap实例共享给两个不同的渲染器。
每个渲染器都有其自己的字符集,允许打印位图的两种表示形式。
输出如下所示:
OXXOOXOOOXOOOXOO.@@..@...@...@..
本示例演示了Flyweight模式。
尽管在此示例中与内存消耗无关紧要,但具有成千上万个实例共享单个基础数据结构对于减少系统的内存消耗可能非常重要。
如本线程所述:
之所以没有指针和指向接口匿名字段的指针,是因为这些类型没有方法。
匿名字段的全部要点是方法得到了推广 。我已经解释了为什么接口没有方法:很多人错误地和不必要地使用了指向接口的指针,并且没有任何已知的有效用法,因此更改了语言,以通过使指向接口的指针具有没有办法。



