【发布时间】:2021-07-23 20:47:33
【问题描述】:
假设我们有 2 个结构共享一个名称和用途相同但大小不同的属性:
type (
L16 struct {
Length uint16
}
L32 struct {
Length uint32
}
)
目标是使这些结构具有GetLength 方法,具有完全相同的签名和实现:
func (h *L16) GetLength() int {
return int(h.Length)
}
func (h *L32) GetLength() int {
return int(h.Length)
}
——但要避免对每个结构重复实现。
所以我试试:
type (
LengthHolder interface {
GetLength() int
}
LengthHolderStruct struct {
LengthHolder
}
L16 struct {
LengthHolderStruct
Length uint16
}
L32 struct {
LengthHolderStruct
Length uint32
}
)
func (h *LengthHolderStruct) GetLength() int {
return int(h.Length)
}
——但是 h.Length undefined (type *LengthHolderStruct has no field or method Length) 的错误。
我们怎么做?
【问题讨论】:
-
@MrFuppes 在我的真实用例中,还有更多的结构可以使用
GetLength方法。每个结构重复它需要大量的维护开销。 -
@mh-cbon 为什么需要只有一个
Length属性的结构?我真的认为在实际用例中这些结构会有更多字段是显而易见的。
标签: go dry composition go-interface