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.