我正在为已知由几种特定类型的帧组成的音频/视频流编写解析器。每个帧类型都有自己的子标题格式,因此我为每个帧类型定义了一个结构类型,以将它们用于作为第三个参数传递给 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 个结构之一)函数将用它填充来自流的值。
如何仅通过 FrameType
变量初始化正确类型的变量?有没有简洁优雅的方案?
说这种技巧是否可行:
TMap := map[FrameType]type{
VideoI: TypeVideoIHeader,
VideoP: TypeVideoPHeader,
Audio: TypeAudioHeader,
}
var videoISubHeader TMap[VideoI]
——这就是我所追求的。
最佳答案
TMap := map[FrameType]func() interface{} {
VideoI: func() interface{} { return &TypeVideoIHeader{} },
VideoP: func() interface{} { return &TypeVideoPHeader{} },
Audio: func() interface{} { return &TypeAudioHeader{} },
}
var videoISubHeader = TMap[VideoI]()
if err := binary.Read(r, order, videoISubHeader); err != nil {
panic(err)
}
请注意 binary.Read
期望第三个参数是指针,否则它将无法将二进制数据读入传入的变量中,这就是函数使用 &
。
关于dictionary - Golang 中的类型映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68482065/