Gre*_*ake 2 dictionary types go
我正在为音频/视频流编写一个解析器,已知该解析器由几种特定类型的帧组成。每个帧类型都有自己的子标头格式,因此我为每个帧类型定义一个结构类型,以将它们用于作为第三个参数传递给binary.Read 的变量:
\ntype TypeVideoIHeader struct {\n MType byte // type of media e.g. H.264\n FPS byte\n Width byte\n Height byte\n DateTime int32\n Length int32\n}\n\ntype TypeVideoPHeader struct {\n Length int32\n}\n\ntype TypeAudioHeader struct {\n MType byte\n SampleRate byte\n Length int16\n}\nRun Code Online (Sandbox Code Playgroud)\n帧的类型是由其标头中的某个字节定义的,因此我将它们放入常量中:
\ntype FrameType byte\n\nconst (\n VideoI FrameType = 0xFC\n VideoP FrameType = 0xFD\n Audio FrameType = 0xFA\n)\nRun Code Online (Sandbox Code Playgroud)\n现在,在调用之前,binary.Read 我必须创建一个正确类型的变量(上面的 3 个结构体之一),函数将用流中的值填充该变量。
如何仅通过FrameType变量初始化正确类型的变量?有没有简洁优雅的解决方案?
说说这种技巧是否可行:
\nTMap := map[FrameType]type{\n VideoI: TypeVideoIHeader,\n VideoP: TypeVideoPHeader,\n Audio: TypeAudioHeader,\n}\n\nvar videoISubHeader TMap[VideoI]\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\x94 这就是我所追求的。
\nTMap := 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)
}
Run Code Online (Sandbox Code Playgroud)
请注意,binary.Read期望第三个参数是一个指针,否则它将无法将二进制数据读入传入的变量中,这就是函数使用&.
| 归档时间: |
|
| 查看次数: |
3320 次 |
| 最近记录: |