#go
#Вперед
Вопрос:
В настоящее время я играю с Go, задавался вопросом, каковы шаблоны для определения типов данных. Для примера возьмем Bencode и представим его как структуру данных Go.
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
}