【问题标题】:How to convert to typeof(field)?如何转换为 typeof(field)?
【发布时间】:2017-08-12 08:38:49
【问题描述】:

鉴于这样的事情:

type Foo struct {
  x int
}

type FooFoo struct {
  foo *Foo
}

type Bar struct {
  x int
}

Foo 隐藏的位置(在我的情况下是由于供应商),我如何创建一个具有有效 foo 条目的 FooFoo 结构?

如果Foo 可用,我可以这样做

foofoo := &FooFoo{ foo: &Foo{5} }

甚至

foofoo := &FooFoo{ foo: (*Foo)&Bar{ 5 } }

但如果不提Foo,我就找不到办法。

我想我需要类似的东西:

foofoo := &FooFoo{ foo: (*typeof(FooFoo.foo)) &Bar{ 5 } }

【问题讨论】:

  • 您将无法以这种方式对 Bar 进行类型转换。也许您可以考虑使用某种接口?
  • 供应商本身“隐藏”类型。你能举一个真实的例子吗?你的并没有真正显示出实际的问题。
  • here 描述了此问题的一个示例:本质上,b 中出售的 a.go 中的 T 类型在 b 之外无法访问。

标签: go


【解决方案1】:

您不应该从另一个库as per this answer 设置私有方法。然而, 该库应该有一个适当的构造函数。库应该有一个看起来像

的方法
func FooFooGenerator(appropriateInfo int) FooFoo {
 ... Library does the work 
}

【讨论】:

  • 问题不在于它是一个私有字段,而在于 Foo 由于供应商而无法使用。如果 Foo 没有出售,问题就不会存在。不幸的是它没有构造函数。
  • 我不确定您所说的 vendored 是什么意思。据我所知,它是一个私有变量(结构中有一个小写字母)有意(或写得不好)如果它是您编写的库,请将其公开?
【解决方案2】:

您只需为FooFoo 导出一个“构造函数”函数并保持您的foo 未导出。

func NewFooFoo() *FooFoo {
    f := &foo{ /* initialize foo */ }
    return &FooFoo{foo:f}
}

然后你的包的客户将可以访问NewFooFooFooFoo,但不能访问foo

至于将Foo 转换为Bar,不知道你为什么要这样做,但你可以做到,如果你在Go1.8+ 上,这样(*Foo)(&Bar{ 5 }) playground.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多