【发布时间】:2021-09-29 13:42:19
【问题描述】:
我正在为已知由几种特定类型的帧组成的音频/视频流编写解析器。每个帧类型都有自己的子标题格式,因此我为每个帧类型定义了一个结构类型,以将它们用于作为第三个参数传递给binary.Read 的变量:
type TypeVideoIHeader struct {
MType byte // type of media e.g. H.264
FPS byte
Width byte
Height byte
DateTime int32
Length int32
}
type TypeVideoPHeader struct {
Length int32
}
type TypeAudioHeader struct {
MType byte
SampleRate byte
Length int16
}
帧的类型是由其头部中的某个字节定义的,所以我将它们放入常量中:
type FrameType byte
const (
VideoI FrameType = 0xFC
VideoP FrameType = 0xFD
Audio FrameType = 0xFA
)
现在,在我可以调用binary.Read之前我必须创建一个正确类型的变量(上面的 3 个结构之一),函数将用流中的值填充该变量。 p>
如何仅通过 FrameType 变量初始化正确类型的变量?有没有简洁优雅的解决方案?
说这种伎俩是否可行:
TMap := map[FrameType]type{
VideoI: TypeVideoIHeader,
VideoP: TypeVideoPHeader,
Audio: TypeAudioHeader,
}
var videoISubHeader TMap[VideoI]
——这就是我所追求的。
【问题讨论】:
-
你需要的是polymorphism;接口(很快,泛型)在 Go 中启用多态性。只需声明所有三种结构类型都满足的接口类型;然后将该接口类型用作地图的值类型。
-
@jub0bs 看起来接口定义了功能契约,但我的示例中的结构没有功能。
-
那你可以使用空接口(@987654329@)或者给自己一个所谓的marker interface。
标签: dictionary go types