dictionary - Golang 中的类型映射?

标签 dictionary go types

我正在为已知由几种特定类型的帧组成的音频/视频流编写解析器。每个帧类型都有自己的子标题格式,因此我为每个帧类型定义了一个结构类型,以将它们用于作为第三个参数传递给 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/

相关文章:

python - switch case 的运行时类型检查

ruby - 我如何处理从 mongo 返回的任意哈希值(使用 mgo)?

c# - 数值类型的 "base class"是什么?

types - 无开销的开关接口(interface)实现

Javascript 不产生输入类型的结果

javascript - RxJs:依次执行 3 个可观察对象,并在第二个请求中使用第一个,在第三个请求中使用第一个和第二个的结果

java - 可以将一系列键映射到值的数据结构

python - Python 的 dict.pop 是原子的吗?

戈朗 : steering window covering

email - 如何将图像插入电子邮件正文?