Golang结构定义模式

时间:2016-10-05 22:46:57

标签: go

我目前正在玩Go,想知道定义数据类型的模式是什么。例如,取Bencode并将其表示为Go数据结构。

like in Haskell

data BEncode = BInt Integer
         | BString L.ByteString
         | BList [BEncode]
         | BDict (Map String BEncode)

in C, we can do something like this

struct Bencoding;

typedef struct ListNode {
    struct Bencoding *cargo;
    struct ListNode *next;
} ListNode;

typedef struct DictNode {
    char *key;
    struct Bencoding *value;
    struct DictNode *next;
} DictNode;

typedef struct Bencoding {
    BType type;
    union {
        long long val;  // used when type == BInt
        ListNode *list; // used when type == BList
        char *str;      // used when type == BString
        DictNode *dict;
    } cargo; // data
} Bencoding;

在Golang中定义这些类型的数据结构的最佳方法是什么。 Golang是否有任何模式/良好实践。

1 个答案:

答案 0 :(得分:0)

喜欢这个吗?

type BEncodeType int

const (
    TypeBInt BEncodeType = iota
    TypeBString
    TypeBList
    TypeBDict
)

type BEncode interface {
    Type() BEncodeType
    Val() interface{}
}

type BInt int

func (n *BInt) Type() BEncodeType {
    return TypeBInt
}
func (n *BInt) Val() interface{} {
    return n
}

type BString string

func (n *BString) Type() BEncodeType {
    return TypeBString
}
func (n *BString) Val() interface{} {
    return n
}

type BList []BEncode

func (n *BList) Type() BEncodeType {
    return TypeBList
}
func (n *BList) Val() interface{} {
    return n
}

type BDict map[string]BEncode

func (n *BDict) Type() BEncodeType {
    return TypeBDict
}
func (n *BDict) Val() interface{} {
    return n
}