本文整理汇总了Golang中reflect.Value.CanInterface方法的典型用法代码示例。如果您正苦于以下问题:Golang Value.CanInterface方法的具体用法?Golang Value.CanInterface怎么用?Golang Value.CanInterface使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类reflect.Value
的用法示例。
在下文中一共展示了Value.CanInterface方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: genericLogData
// Pretty-print any random data we get back from the server
func genericLogData(name string, v reflect.Value, indent string, skip int) {
prefix := "->" + indent
if name != "" {
prefix = "-> " + indent + name + ":"
}
// For pointers and interfaces, just grab the underlying value and try again
if v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {
genericLogData(name, v.Elem(), indent, skip)
return
}
// Only print if skip is 0. Recursive calls should indent or decrement skip, depending on if anything was
// printed.
var skipped bool
if skip == 0 {
skipped = false
indent = indent + " "
} else {
skipped = true
skip = skip - 1
}
switch v.Kind() {
case reflect.Struct:
if !skipped {
Log("%s\n", prefix)
}
for f := 0; f < v.NumField(); f++ {
name := v.Type().Field(f).Name
genericLogData(name, v.Field(f), indent, skip)
}
case reflect.Array:
fallthrough
case reflect.Slice:
if !skipped {
Log("%s\n", prefix)
}
for i := 0; i < v.Len(); i++ {
genericLogData("", v.Index(i), indent, skip)
}
case reflect.Map:
if !skipped {
Log("%s\n", prefix)
}
for _, k := range v.MapKeys() {
if name, ok := k.Interface().(string); ok {
genericLogData(name, v.MapIndex(k), indent, skip)
} else {
genericLogData("Unknown field", v.MapIndex(k), indent, skip)
}
}
default:
if v.CanInterface() {
Log("%s %v", prefix, v.Interface())
} else {
Log("%s <Invalid>", prefix)
}
}
}
示例2: isValueKind
func isValueKind(v *reflect.Value, isEmpty *bool, val *interface{}) bool {
switch v.Kind() {
case
reflect.Bool,
reflect.Int,
reflect.Int8,
reflect.Int16,
reflect.Int32,
reflect.Int64,
reflect.Uint,
reflect.Uint8,
reflect.Uint16,
reflect.Uint32,
reflect.Uint64,
reflect.Uintptr,
reflect.Float32,
reflect.Float64,
reflect.Complex64,
reflect.Complex128:
if val != nil && v.CanInterface() {
*val = v.Interface()
}
if isEmpty != nil {
*isEmpty = false
}
return true
}
return false
}
示例3: equal
// equal return true when lhsV and rhsV is same value.
func equal(lhsV, rhsV reflect.Value) bool {
lhsIsNil, rhsIsNil := isNil(lhsV), isNil(rhsV)
if lhsIsNil && rhsIsNil {
return true
}
if (!lhsIsNil && rhsIsNil) || (lhsIsNil && !rhsIsNil) {
return false
}
if lhsV.Kind() == reflect.Interface || lhsV.Kind() == reflect.Ptr {
lhsV = lhsV.Elem()
}
if rhsV.Kind() == reflect.Interface || rhsV.Kind() == reflect.Ptr {
rhsV = rhsV.Elem()
}
if !lhsV.IsValid() || !rhsV.IsValid() {
return true
}
if isNum(lhsV) && isNum(rhsV) {
if rhsV.Type().ConvertibleTo(lhsV.Type()) {
rhsV = rhsV.Convert(lhsV.Type())
}
}
if lhsV.CanInterface() && rhsV.CanInterface() {
return reflect.DeepEqual(lhsV.Interface(), rhsV.Interface())
}
return reflect.DeepEqual(lhsV, rhsV)
}
示例4: printValue
// printValue is like printArg but starts with a reflect value, not an interface{} value.
func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
if !value.IsValid() {
switch verb {
case 'T', 'v':
p.buf.WriteString(nilAngleString)
default:
p.badVerb(verb)
}
return
}
// Special processing considerations.
// %T (the value's type) and %p (its address) are special; we always do them first.
switch verb {
case 'T':
p.printArg(value.Type().String(), 's', 0)
return
case 'p':
p.fmtPointer(value, verb)
return
}
// Handle values with special methods.
// Call always, even when arg == nil, because handleMethods clears p.fmt.plus for us.
p.arg = nil // Make sure it's cleared, for safety.
if value.CanInterface() {
p.arg = value.Interface()
}
if p.handleMethods(verb, depth) {
return
}
p.printReflectValue(value, verb, depth)
}
示例5: Return
func (vk *GenericInvoker) Return(f interface{}, returns []interface{}) ([]interface{}, error) {
funcT := reflect.TypeOf(f)
// make sure parameter matched
if len(returns) != funcT.NumOut() {
return nil, fmt.Errorf("Parameter Count mismatch: %v %v", len(returns), funcT.NumOut())
}
var (
err error
ret reflect.Value
)
out := make([]interface{}, funcT.NumOut())
for i := 0; i < funcT.NumOut(); i++ {
ret, err = vk.from(returns[i], funcT.Out(i))
if err != nil {
return nil, err
}
if ret.CanInterface() {
out[i] = ret.Interface()
} else {
return nil, fmt.Errorf("Unable to convert to interface{} for %d", i)
}
}
return out, nil
}
示例6: isZero
// thanks James Henstridge
// TODO: tweak
// TODO: IsZero() interface support
func isZero(rv reflect.Value) bool {
// use IsZero for supported types
if rv.CanInterface() {
if zeroer, ok := rv.Interface().(isZeroer); ok {
return zeroer.IsZero()
}
}
switch rv.Kind() {
case reflect.Func, reflect.Map, reflect.Slice:
return rv.IsNil()
case reflect.Array:
z := true
for i := 0; i < rv.Len(); i++ {
z = z && isZero(rv.Index(i))
}
return z
case reflect.Struct:
z := true
for i := 0; i < rv.NumField(); i++ {
z = z && isZero(rv.Field(i))
}
return z
}
// Compare other types directly:
z := reflect.Zero(rv.Type())
return rv.Interface() == z.Interface()
}
示例7: setFieldDefaults
func setFieldDefaults(v reflect.Value, sf reflect.StructField, s reflect.Value) {
if v.CanInterface() && reflect.DeepEqual(
v.Interface(), reflect.Zero(v.Type()).Interface()) {
tag := sf.Tag.Get("ebmldef")
if tag != "" {
switch v.Kind() {
case reflect.Int, reflect.Int64:
u, _ := strconv.ParseInt(tag, 10, 0)
v.SetInt(int64(u))
case reflect.Uint, reflect.Uint64:
u, _ := strconv.ParseUint(tag, 10, 0)
v.SetUint(u)
case reflect.Float32, reflect.Float64:
f, _ := strconv.ParseFloat(tag, 64)
v.SetFloat(f)
case reflect.String:
v.SetString(tag)
default:
log.Panic("Unsupported default value")
}
}
ltag := sf.Tag.Get("ebmldeflink")
if ltag != "" {
v.Set(s.FieldByName(ltag))
}
}
}
示例8: ToCsv
// ToCsv takes a struct and returns CSV line with data delimited by delim and
// true, false values translated to boolTrue, boolFalse respectively.
func ToCsv(v interface{}, delim, boolTrue, boolFalse string) string {
var csvLine []string
var strValue string
var structField reflect.StructField
var field reflect.Value
t := reflect.ValueOf(v)
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
if t.Kind() != reflect.Struct {
panic("Expected pointer to a struct")
}
for i := 0; i < t.NumField(); i++ {
structField = t.Type().Field(i)
field = t.Field(i)
if structField.Anonymous {
strValue = ToCsv(field.Interface(), delim, boolTrue, boolFalse)
csvLine = append(csvLine, strValue)
continue
}
if !skip(structField.Tag) && field.CanInterface() {
strValue = getValue(field, boolTrue, boolFalse)
csvLine = append(csvLine, strValue)
}
}
return strings.Join(csvLine, delim)
}
示例9: unmarshalAttr
// unmarshalAttr unmarshals a single XML attribute into val.
func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error {
if val.Kind() == reflect.Ptr {
if val.IsNil() {
val.Set(reflect.New(val.Type().Elem()))
}
val = val.Elem()
}
if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) {
// This is an unmarshaler with a non-pointer receiver,
// so it's likely to be incorrect, but we do what we're told.
return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr)
}
if val.CanAddr() {
pv := val.Addr()
if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) {
return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr)
}
}
// Not an UnmarshalerAttr; try encoding.TextUnmarshaler.
if val.CanInterface() && val.Type().Implements(textUnmarshalerType) {
// This is an unmarshaler with a non-pointer receiver,
// so it's likely to be incorrect, but we do what we're told.
return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value))
}
if val.CanAddr() {
pv := val.Addr()
if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) {
return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value))
}
}
return copyValue(val, []byte(attr.Value))
}
示例10: bypassCanInterface
// bypassCanInterface returns a version of v that
// bypasses the CanInterface check.
func bypassCanInterface(v reflect.Value) reflect.Value {
if !v.IsValid() || v.CanInterface() {
return v
}
*flagField(&v) &^= flagRO
return v
}
示例11: isZeroVal
func isZeroVal(val reflect.Value) bool {
if !val.CanInterface() {
return false
}
z := reflect.Zero(val.Type()).Interface()
return reflect.DeepEqual(val.Interface(), z)
}
示例12: isZero
// IsZero returns true when the value is a zero for the type
func isZero(data reflect.Value) bool {
if !data.CanInterface() {
return true
}
tpe := data.Type()
return reflect.DeepEqual(data.Interface(), reflect.Zero(tpe).Interface())
}
示例13: printValue
// printValue is like printArg but starts with a reflect value, not an interface{} value.
func (p *pp) printValue(value reflect.Value, verb rune, plus, goSyntax bool, depth int) (wasString bool) {
if !value.IsValid() {
if verb == 'T' || verb == 'v' {
p.buf.Write(nilAngleBytes)
} else {
p.badVerb(verb)
}
return false
}
// Special processing considerations.
// %T (the value's type) and %p (its address) are special; we always do them first.
switch verb {
case 'T':
p.printArg(value.Type().String(), 's', false, false, 0)
return false
case 'p':
p.fmtPointer(value, verb, goSyntax)
return false
}
// Handle values with special methods.
// Call always, even when arg == nil, because handleMethods clears p.fmt.plus for us.
p.arg = nil // Make sure it's cleared, for safety.
if value.CanInterface() {
p.arg = value.Interface()
}
if isString, handled := p.handleMethods(verb, plus, goSyntax, depth); handled {
return isString
}
return p.printReflectValue(value, verb, plus, goSyntax, depth)
}
示例14: printValue
func printValue(v reflect.Value, space int) {
if !v.CanInterface() {
fmt.Print(v)
} else {
printVar(v.Interface(), space)
}
}
示例15: formatValue
func formatValue(value reflect.Value, indentation uint) string {
if indentation > MaxDepth {
return "..."
}
if isNilValue(value) {
return "nil"
}
if UseStringerRepresentation {
if value.CanInterface() {
obj := value.Interface()
switch x := obj.(type) {
case fmt.GoStringer:
return x.GoString()
case fmt.Stringer:
return x.String()
}
}
}
switch value.Kind() {
case reflect.Bool:
return fmt.Sprintf("%v", value.Bool())
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return fmt.Sprintf("%v", value.Int())
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return fmt.Sprintf("%v", value.Uint())
case reflect.Uintptr:
return fmt.Sprintf("0x%x", value.Uint())
case reflect.Float32, reflect.Float64:
return fmt.Sprintf("%v", value.Float())
case reflect.Complex64, reflect.Complex128:
return fmt.Sprintf("%v", value.Complex())
case reflect.Chan:
return fmt.Sprintf("0x%x", value.Pointer())
case reflect.Func:
return fmt.Sprintf("0x%x", value.Pointer())
case reflect.Ptr:
return formatValue(value.Elem(), indentation)
case reflect.Slice:
return formatSlice(value, indentation)
case reflect.String:
return formatString(value.String(), indentation)
case reflect.Array:
return formatSlice(value, indentation)
case reflect.Map:
return formatMap(value, indentation)
case reflect.Struct:
return formatStruct(value, indentation)
case reflect.Interface:
return formatValue(value.Elem(), indentation)
default:
if value.CanInterface() {
return fmt.Sprintf("%#v", value.Interface())
} else {
return fmt.Sprintf("%#v", value)
}
}
}