gpt4 book ai didi

戈朗 : code duplication and similar structs

转载 作者:IT王子 更新时间:2023-10-29 02:23:44 25 4
gpt4 key购买 nike

在 Go 中父类(super class)相似(但不相同)的数据类型以最小化代码重复的惯用方法是什么?陈词滥调的例子:

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)
}

显然还有更多的东西,但我希望能够以某种方式对它们进行父类(super class)化,这样我只需要编写和维护特定函数的一个副本。界面似乎是“正确”的方式,但还有很多不足之处(非工作示例):

type Utmp interface {
Time() time.Time
}

func User(u Utmp) string {
return string(u.ut_user[:])
}

我也考虑过嵌入,但这似乎也是一个死胡同,因为 Go 的类型非常严格。我是否注定要拥有多段代码,除了签名之外,其他方面都完全相同?

[编辑]

复杂的部分是我使用 encoding/binary.Read() 来根据字节顺序解析此数据(它不仅仅是 utmp 记录,也不仅仅是 Linux/BSD)。要使用它,字段必须按照它们在磁盘上的精确顺序 [exported] 在结构中。因此我不能只嵌入另一个结构的字段,因为在某些记录中它们的顺序不同(并且大小不同)

最佳答案

我不明白你对嵌入的评论。这是我的做法(使用嵌入):

package test

import "time"

type Utmp struct {
// Common fields
}

func (u Utmp) User() {
return string(l.ut_user[:])
}

type LinuxUtmp struct {
Utmp
// Linux specific fields
}

func (l LinuxUtmp) Time() time.Time {
return time.Unix(int64(l.tv_sec), int64(l.tv_usec))
}

type BsdUtmp struct {
Utmp
// BSD specific fields
}

func (b BsdUtmp) Time() time.Time {
return time.Unix(int64(b.ut_time), 0)
}

任何导入该库的代码都可以直接在LinuxUtmpBsdUtmp 对象上直接调用User() 方法作为l.User( )b.User() 而根本不提及 Utmp。如果愿意,您甚至可以将 Utmp 设置为意外(如 utmp)。

查看 Effective Go了解详情。

如果您愿意,您甚至可以确保只有适用于相关平台的代码被编译到二进制文件中。 This blog有一些例子。为了简单起见,如果特定于平台的代码不是很大或涉及其他因素,我不会费心去走那条路。

为了完整起见,这里是官方go build文档。

关于戈朗 : code duplication and similar structs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33047091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com