Go to superclass 类似(但不相同)的数据类型以最小化代码重复的惯用方法是什么?老生常谈的例子:
import "time"
type LinuxUtmp struct {
ut_type uint16
_ [2]byte
ut_pid uint32
ut_line [32]byte
ut_id [4]byte
ut_user [32]byte
ut_host [256]byte
exit_status [2]uint32
tv_sec uint32
tv_usec uint32
...
}
func (l LinuxUtmp) User() string {
return string(l.ut_user[:])
}
func (l LinuxUtmp) Time() time.Time {
return time.Unix(int64(l.tv_sec), int64(l.tv_usec))
}
type BsdUtmp struct {
ut_line [8]char
ut_name [16]char
ut_host [16]char
ut_time uint32
}
func (b BsdUtmp) User() string {
return string(b.ut_user[:])
}
func (b BsdUtmp) Time() time.Time {
return time.Unix(int64(b.ut_time), 0)
}
显然还有更多的东西,但我希望能够以某种方式超类那些,所以我只需要编写和维护特定函数的一个副本。接口似乎是“正确”的方式,但这还有很多不足之处(非工作示例):
type Utmp interface {
Time() time.Time
}
func User(u Utmp) string {
return string(u.ut_user[:])
}
我也考虑过嵌入,但这似乎也是一个死胡同,因为 Go 的类型如此严格。我是否注定要拥有除签名外在各方面都相同的多段代码?
[编辑]
部分复杂之处在于我使用 encoding/binary.Read() 根据字节序解析这些数据(不仅仅是 utmp 记录,而不仅仅是 Linux/BSD)。要使用它,字段必须按照它们在磁盘上的精确顺序在结构中[导出]。因此我不能只嵌入另一个结构的字段,因为在某些记录中它们的顺序不同(并且大小不同)
萧十郎
烙印99
相关分类