Something seldom use but interesting...
golang's method expression, a bit smells like C++ std::bind ....
print out:
42
38
func(main.Fun)
func(*main.Fun)
43
39
func()
func()
golang's method expression, a bit smells like C++ std::bind ....
package main
import (
"fmt"
"reflect"
)
type Fun struct {
A int
}
func (f Fun) run() {
fmt.Println(f.A)
}
func (f *Fun) runWithPtr() {
fmt.Println(f.A)
}
func main() {
var f = Fun.run // Method expression
var fptr = (*Fun).runWithPtr // Method expression
f(Fun{42}) // Passing in this object
fptr(&Fun{38}) // Passing in this ptr
fmt.Println(reflect.TypeOf(f)) // type has this
fmt.Println(reflect.TypeOf(fptr)) // this has this ptr
//-------------
var bindf = Fun{43}.run
// With escape analysis, there's no pr-value, x-value,
// no more thinking about stack/heap, lifetime of an type instance etc.
// Good or Bad? :-P
var bindfPtr = (&Fun{39}).runWithPtr
bindf()
bindfPtr()
fmt.Println(reflect.TypeOf(bindf)) // type has no this
fmt.Println(reflect.TypeOf(bindfPtr)) // type has no this ptr
}
print out:
42
38
func(main.Fun)
func(*main.Fun)
43
39
func()
func()
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.