2016-10-05 3 views
0

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

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. Существуют ли какие-либо закономерности/хорошие практики с Голаном.

+2

структуры являются единственным типом объекта в Go и они следуют те же самые правила, как и в C. Если вы знаете достаточно, чтобы задать вопрос, вы должны также знать достаточно, чтобы найти ответ. – evanmcdonnal

ответ

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 
} 
Смежные вопросы