英文:
How to convert to typeof(field)?
问题
给定类似以下的代码:
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}) }
请注意,这只是一种假设的解决方案,实际上并不能在Go语言中实现。
英文:
Given something like this:
type Foo struct {
x int
}
type FooFoo struct {
foo *Foo
}
type Bar struct {
x int
}
Where Foo
is hidden (in my case due to vendoring), how can I create a FooFoo struct with a valid foo entry?
If Foo
were available, I could do
foofoo := &FooFoo{ foo: &Foo{5} }
or even
foofoo := &FooFoo{ foo: (*Foo)&Bar{ 5 } }
But I can't find a way to do it without mentioning Foo
.
I think I would need something like:
foofoo := &FooFoo{ foo: (*typeof(FooFoo.foo)) &Bar{ 5 } }
答案1
得分: 1
你不应该从另一个库中设置私有方法(根据这个答案)。然而,该库应该有一个适当的构造函数。该库应该有一个类似下面的方法:
func FooFooGenerator(appropriateInfo int) FooFoo {
// ...库执行工作
}
英文:
You shouldn't set the private method from another library as per this answer. However,
the library should have an appropriate constructor. The library should have a method that looks like
func FooFooGenerator(appropriateInfo int) FooFoo {
... Library does the work
}
答案2
得分: 0
你只需要为FooFoo
导出一个"constructor"函数,并保持foo
未导出。
func NewFooFoo() *FooFoo {
f := &foo{ /* 初始化 foo */ }
return &FooFoo{foo:f}
}
然后你的包的客户端将可以访问NewFooFoo
和FooFoo
,但不能访问foo
。
至于将Foo
转换为Bar
,不确定你为什么想要这样做,但如果你使用的是**Go1.8+**版本,你可以这样做:(*Foo)(&Bar{ 5 })
playground。
英文:
You just need to export a "constructor" function for FooFoo
and keep your foo
unexported.
func NewFooFoo() *FooFoo {
f := &foo{ /* initialize foo */ }
return &FooFoo{foo:f}
}
Then clients of you package will have access to NewFooFoo
, and FooFoo
, but not foo
.
And as for casting Foo
to Bar
, not sure why you would want that, but you can do it, if you are on Go1.8+, this way (*Foo)(&Bar{ 5 })
playground.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论