英文:
Partially embedded struct
问题
我可以将类型A嵌入到B中。
type A struct {
R int64
S int64
}
type B struct {
A
}
但是如何只嵌入一个字段呢?
type B struct {
A.R // 无法工作
}
英文:
I can embed type A into B.
type A struct {
R int64
S int64
}
type B struct {
A
}
But how do I embed just a single field?
type B struct {
A.R // does not work
}
答案1
得分: 3
假设你有两个结构体数据类型 A
和 B
。
如果你想让 A
和 B
都有一个名为 F
、类型为 T
的字段,你可以这样做:
type (
A struct {
F T
}
B struct {
F T
}
)
如果你只想在源代码中的一个位置更改类型 T
,你可以这样抽象它:
type (
T = someType
A struct {
F T
}
B struct {
F T
}
)
如果你只想在源代码中的一个位置更改 F
的名称,你可以这样抽象它:
type (
myField struct {
F T
}
A struct {
myField
}
B struct {
myField
}
)
如果你有多个可抽象的字段需要抽象,它们必须分别进行抽象,像这样:
type (
myField1 struct {
F1 T1
}
myField2 struct {
F2 T2
}
A struct {
myField1
myField2
}
B struct {
myField1
}
)
英文:
Let's suppose your two struct data types A
and B
.
If you want A
and B
to both have a field named F
of type T
, you can do it like so
type (
A struct {
F T
}
B struct {
F T
}
)
If you wish to change type T
in only one location in the source, you can abstract it like so
type (
T = someType
A struct {
F T
}
B struct {
F T
}
)
If you wish to change the name of F
in only one location in the source, you can abstract it like so
type (
myField struct {
F T
}
A struct {
myField
}
B struct {
myField
}
)
If you have multiple extricable fields to abstract, they must be abstracted individually like so
type (
myField1 struct {
F1 T1
}
myField2 struct {
F2 T2
}
A struct {
myField1
myField2
}
B struct {
myField1
}
)
答案2
得分: 0
你不能嵌入单个字段。你只能嵌入整个类型。
如果你想嵌入单个字段,你需要创建一个只包含该字段的新类型,然后嵌入该类型:
type R struct {
R int64
}
type B struct {
R
}
英文:
You can't embed a single field. You can only embed an entire type.
If you want to embed a single field, you'll need to create a new type that contains only that field, and embed that type instead:
type R struct {
R int64
}
type B struct {
R
}
答案3
得分: 0
这是我现在的最佳解决方案...
type A struct {
R int64
S int64
}
type B struct {
R A
}
然后在实现过程中...
&B{
R: &A{
R,
// S, - 理想情况下,我们不应该能够传入 `S`
}
}
我不喜欢这个解决方案,因为我们仍然可以传入 S
...
更新: 根据 @HymnsForDisco 的回答,可以这样编码...
// 可以使用类型定义 `type AR int64`,
// 而不是类型别名(下面的方式),但这将
// 要求我们创建并传递 `&AR{}` 对象,
// 给 `&A{}` 或 `&B{}` 的 `R` 字段。
type AR = int64
type A struct {
R AR
S int64
}
type B struct {
R AR
}
并实现为...
&B{
R,
}
英文:
This is the best solution I have now...
type A struct {
R int64
S int64
}
type B struct {
R A
}
And then during implementation...
&B{
R: &A{
R,
// S, - ideally we would not be able to pass in `S`
}
}
I don't like this solution, because we can still pass in S
...
Update: Based on @HymnsForDisco answer this could be coded as...
// A type definition could be used `type AR int64`,
// instead of a type alias (below), but that would
// require us to create and pass the `&AR{}` object,
// to `&A{}` or `&B{}` for the `R` field.
type AR = int64
type A struct {
R AR
S int64
}
type B struct {
R AR
}
And implemented as...
&B{
R,
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论