Files
llgo/cl/_testgo/reflect/in.go
2024-11-19 20:51:08 +08:00

102 lines
1.8 KiB
Go

package main
import (
"reflect"
"unsafe"
)
func main() {
callFunc()
callClosure()
callMethod()
callIMethod()
}
func callFunc() {
var f any = func(n int) int {
println("call.func")
return n + 1
}
fn := reflect.ValueOf(f)
println("func", fn.Kind(), fn.Type().String())
r := fn.Call([]reflect.Value{reflect.ValueOf(100)})
println(r[0].Int())
ifn, ok := fn.Interface().(func(int) int)
if !ok {
panic("error")
}
ifn(100)
}
func callClosure() {
m := 100
var f any = func(n int) int {
println("call.closure")
return m + n + 1
}
fn := reflect.ValueOf(f)
println("closure", fn.Kind(), fn.Type().String())
r := fn.Call([]reflect.Value{reflect.ValueOf(100)})
println(r[0].Int())
ifn, ok := fn.Interface().(func(int) int)
if !ok {
panic("error")
}
ifn(100)
}
type T struct {
n int
}
func (t *T) Add(n int) int {
println("call.method")
t.n += n
return t.n
}
type I interface {
Add(n int) int
}
type abi struct {
typ unsafe.Pointer
data unsafe.Pointer
}
func callMethod() {
t := &T{1}
v := reflect.ValueOf(t)
fn := v.Method(0)
println("method", fn.Kind(), fn.Type().String())
r := fn.Call([]reflect.Value{reflect.ValueOf(100)})
println(r[0].Int())
//TODO type assert
// ifn, ok := fn.Interface().(func(int) int)
// if !ok {
// panic("error")
// }
// ifn(1)
v2 := reflect.ValueOf(fn.Interface())
r2 := v2.Call([]reflect.Value{reflect.ValueOf(100)})
println(r2[0].Int())
}
func callIMethod() {
var i I = &T{1}
v := reflect.ValueOf(i)
fn := v.Method(0)
println("imethod", fn.Kind(), fn.Type().String())
r := fn.Call([]reflect.Value{reflect.ValueOf(100)})
println(r[0].Int())
//TODO type assert
// ifn, ok := fn.Interface().(func(int) int)
// if !ok {
// panic("error")
// }
// ifn(1)
v2 := reflect.ValueOf(fn.Interface())
r2 := v2.Call([]reflect.Value{reflect.ValueOf(100)})
println(r2[0].Int())
}