Golang 中的类型映射?

Gre*_*ake 2 dictionary types go

我正在为音频/视频流编写一个解析器,已知该解析器由几种特定类型的帧组成。每个帧类型都有自己的子标头格式,因此我为每个帧类型定义一个结构类型,以将它们用于作为第三个参数传递给binary.Read 的变量:

\n
type 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}\n
Run Code Online (Sandbox Code Playgroud)\n

帧的类型是由其标头中的某个字节定义的,因此我将它们放入常量中:

\n
type FrameType byte\n\nconst (\n    VideoI  FrameType = 0xFC\n    VideoP  FrameType = 0xFD\n    Audio   FrameType = 0xFA\n)\n
Run Code Online (Sandbox Code Playgroud)\n

现在,在调用之前,binary.Read 我必须创建一个正确类型的变量(上面的 3 个结构体之一),函数将用流中的值填充该变量。

\n

如何仅通过FrameType变量初始化正确类型的变量?有没有简洁优雅的解决方案?

\n

说说这种技巧是否可行:

\n
TMap := map[FrameType]type{\n    VideoI: TypeVideoIHeader,\n    VideoP: TypeVideoPHeader,\n    Audio: TypeAudioHeader,\n}\n\nvar videoISubHeader TMap[VideoI]\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\x94 这就是我所追求的。

\n

mko*_*iva 7

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)
}
Run Code Online (Sandbox Code Playgroud)

请注意,binary.Read期望第三个参数是一个指针,否则它将无法将二进制数据读入传入的变量中,这就是函数使用&.