我想定义一个带有数字字段的ASN.1结构。我为这个数字使用了一个自定义类型,以明确处理什么类型的值,并让编译器捕捉一些与类型相关的错误(例如,试图使用语义上不适合字段的其他数值(。
但是,序列化程序不知道如何处理这个字段,因为它不是Go基元类型。
以下是一个说明问题的最小示例:
package main
import (
"encoding/asn1"
"fmt"
)
type MessageType uint
const (
Signal MessageType = 1
Payload = 2
Control = 3
)
type Packet struct {
Type MessageType
// more stuff here ...
}
func main() {
fmt.Println(Signal)
var packet Packet
packet.Type = Payload
fmt.Println(asn1.Marshal(packet))
}
当我运行它时,错误为[] asn1: structure error: unknown Go type: main.MessageType
。如果我使用纯整数而不是自定义的MessageType
,它会起作用,但在这种情况下,我没有获得使用特定类型的好处。
围棋中处理这种情况的正确方法是什么?ASN1模块的文档没有提供任何解决这个问题的示例。
所以这是正常的,你只能编码基本类型的
在它调用编码/asn1库之前,您需要编写更多的代码
如果你想解决的问题很简单,你可以手动完成。
但是,使用ASN.1时的正常过程是:
- 编写ASN.1规范
- 使用工具编译它,并用您喜欢的语言生成存根
- 编写一些将使用这些存根的代码
我想你不会在Go 中找到免费的工具来做到这一点