func (gtype *Gtype) isArrayLike() bool {
	kind := gtype.getKind()
	return kind == G_ARRAY || kind == G_SLICE
}
is array or slice
package main
type EType int
const undefinedSize = -1
const (
	G_UNKOWNE   EType = iota
	G_DEPENDENT        
	G_NAMED
	G_INT
	G_BOOL
	G_BYTE
	G_UINT_PTR
	G_UINT_16
	G_STRUCT
	G_ARRAY
	G_SLICE
	G_STRING
	G_MAP
	G_POINTER
	G_FUNC
	G_INTERFACE
)
type signature struct {
	fname      identifier
	params     []*ExprVariable
	rettypes   []*Gtype
}
type Gtype struct {
	kind           EType                        
	receiverTypeId int                          
	dependendson   Expr                         
	relation       *Relation                    
	size           int                          
	origType       *Gtype                       
	fields         []*Gtype                     
	fieldname      identifier                   
	offset         int                          
	padding        int                          
	length         int                          
	elementType    *Gtype                       
	imethods       map[identifier]*signature    
	methods        map[identifier]*ExprFuncRef  
	mapKey         *Gtype                       
	mapValue       *Gtype                       
}
func imethodGet(imethods map[identifier]*signature, name identifier) (*signature, bool) {
	ref, ok := imethods[identifier(name)]
	return ref, ok
}
func imethodSet(imethods map[identifier]*signature, name identifier, sig *signature) {
	imethods[identifier(name)] = sig
}
func methodGet(methods map[identifier]*ExprFuncRef, name identifier) (*ExprFuncRef, bool) {
	ref, ok := methods[identifier(name)]
	return ref, ok
}
func methodSet(methods map[identifier]*ExprFuncRef, name identifier, ref *ExprFuncRef) {
	methods[identifier(name)] = ref
}
func (gtype *Gtype) isNil() bool {
	if gtype == nil {
		return true
	}
	if gtype.kind == G_NAMED {
		return gtype.relation.gtype == nil
	}
	return false
}
func (gtype *Gtype) Underlying() *Gtype {
	if gtype.kind == G_NAMED {
		if gtype.relation.gtype == nil {
			return gtype
		}
		return gtype.relation.gtype.Underlying()
	}
	return gtype
}
func (gtype *Gtype) getKind() EType {
	if gtype == nil {
		return G_UNKOWNE
	}
	return gtype.Underlying().kind
}