102 lines
1.8 KiB
Go
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())
|
|
}
|