Шаблоны определения структуры Golang

#go

#Вперед

Вопрос:

В настоящее время я играю с Go, задавался вопросом, каковы шаблоны для определения типов данных. Для примера возьмем Bencode и представим его как структуру данных Go.

как в Haskell

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

в C мы можем сделать что-то вроде этого

 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. структуры — это единственный тип объекта в Go, и они следуют большинству тех же правил, что и в C. Если вы знаете достаточно, чтобы задать вопрос, вы также должны знать достаточно, чтобы найти ответ.

Ответ №1:

Нравится это?

 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
}