reflect: implement Value.Elem() for interface values
Этот коммит содержится в:
родитель
d15e32fb89
коммит
823c9c25cf
3 изменённых файлов: 41 добавлений и 1 удалений
|
@ -400,7 +400,14 @@ func (v Value) Elem() Value {
|
||||||
value: ptr,
|
value: ptr,
|
||||||
flags: v.flags | valueFlagIndirect,
|
flags: v.flags | valueFlagIndirect,
|
||||||
}
|
}
|
||||||
default: // not implemented: Interface
|
case Interface:
|
||||||
|
typecode, value := decomposeInterface(*(*interface{})(v.value))
|
||||||
|
return Value{
|
||||||
|
typecode: typecode,
|
||||||
|
value: value,
|
||||||
|
flags: v.flags &^ valueFlagIndirect,
|
||||||
|
}
|
||||||
|
default:
|
||||||
panic(&ValueError{"Elem"})
|
panic(&ValueError{"Elem"})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
5
testdata/reflect.go
предоставленный
5
testdata/reflect.go
предоставленный
|
@ -120,6 +120,8 @@ func main() {
|
||||||
&linkedList{
|
&linkedList{
|
||||||
foo: 42,
|
foo: 42,
|
||||||
},
|
},
|
||||||
|
// interfaces
|
||||||
|
[]interface{}{3, "str", -4 + 2.5i},
|
||||||
} {
|
} {
|
||||||
showValue(reflect.ValueOf(v), "")
|
showValue(reflect.ValueOf(v), "")
|
||||||
}
|
}
|
||||||
|
@ -377,6 +379,9 @@ func showValue(rv reflect.Value, indent string) {
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
println(indent + " interface")
|
println(indent + " interface")
|
||||||
println(indent+" nil:", rv.IsNil())
|
println(indent+" nil:", rv.IsNil())
|
||||||
|
if !rv.IsNil() {
|
||||||
|
showValue(rv.Elem(), indent+" ")
|
||||||
|
}
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
println(indent + " map")
|
println(indent + " map")
|
||||||
println(indent+" nil:", rv.IsNil())
|
println(indent+" nil:", rv.IsNil())
|
||||||
|
|
28
testdata/reflect.txt
предоставленный
28
testdata/reflect.txt
предоставленный
|
@ -334,6 +334,34 @@ reflect type: ptr
|
||||||
exported: false
|
exported: false
|
||||||
reflect type: int addrable=true
|
reflect type: int addrable=true
|
||||||
int: 42
|
int: 42
|
||||||
|
reflect type: slice comparable=false
|
||||||
|
slice: interface 3 3
|
||||||
|
pointer: true
|
||||||
|
nil: false
|
||||||
|
indexing: 0
|
||||||
|
reflect type: interface settable=true addrable=true
|
||||||
|
interface
|
||||||
|
nil: false
|
||||||
|
reflect type: int
|
||||||
|
int: 3
|
||||||
|
indexing: 1
|
||||||
|
reflect type: interface settable=true addrable=true
|
||||||
|
interface
|
||||||
|
nil: false
|
||||||
|
reflect type: string
|
||||||
|
string: str 3
|
||||||
|
reflect type: uint8
|
||||||
|
uint: 115
|
||||||
|
reflect type: uint8
|
||||||
|
uint: 116
|
||||||
|
reflect type: uint8
|
||||||
|
uint: 114
|
||||||
|
indexing: 2
|
||||||
|
reflect type: interface settable=true addrable=true
|
||||||
|
interface
|
||||||
|
nil: false
|
||||||
|
reflect type: complex128
|
||||||
|
complex: (-4.000000e+000+2.500000e+000i)
|
||||||
reflect type: ptr
|
reflect type: ptr
|
||||||
pointer: true int8
|
pointer: true int8
|
||||||
nil: false
|
nil: false
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче