func (v *Value) Get() interface{} { t := Type(v.g().g_type) switch t { case TYPE_INVALID: return nil case TYPE_STRING: return C.GoString((*C.char)(C.g_value_get_string(v.g()))) case TYPE_GO_INT: return int(C.g_value_get_long(v.g())) case TYPE_GO_UINT: return uint(C.g_value_get_ulong(v.g())) case TYPE_CHAR: return int8(C.g_value_get_schar(v.g())) case TYPE_UCHAR: return uint8(C.g_value_get_uchar(v.g())) case TYPE_GO_INT32: return int32(C.g_value_get_int(v.g())) case TYPE_GO_UINT32: return uint32(C.g_value_get_uint(v.g())) case TYPE_INT64: return int64(C.g_value_get_int64(v.g())) case TYPE_UINT64: return uint64(C.g_value_get_uint64(v.g())) case TYPE_BOOLEAN: return (C.g_value_get_boolean(v.g()) != C.gboolean(0)) case TYPE_FLOAT: return float32(C.g_value_get_float(v.g())) case TYPE_DOUBLE: return float64(C.g_value_get_double(v.g())) case TYPE_POINTER: return Pointer(C.g_value_get_pointer(v.g())) case TYPE_GTYPE: return Type(C.g_value_get_gtype(v.g())) } if t.IsA(TYPE_OBJECT) { o := new(Object) o.SetPtr(Pointer(C.g_value_get_object(v.g()))) return o } if C.g_value_fits_pointer(v.g()) != 0 { return Pointer(C.g_value_peek_pointer(v.g())) } // Value of unknown type is returned as is return v }
// GetType() is a wrappr around the G_VALUE_HOLDS_GTYPE() macro and // the g_value_get_gtype() function. GetType() returns TYPE_INVALID if v // does not hold a Type, or otherwise returns the Type of v. func (v *Value) GetType() Type { c := C._g_value_holds_gtype(C.gpointer(unsafe.Pointer(v.Native()))) if gobool(c) { c := C.g_value_get_gtype(v.Native()) return Type(c) } return TYPE_INVALID }