<pre><code>
package main
import (
"fmt"
"reflect"
)
type Foo struct {
X string
Y int
}
func (f *Foo) Do() {
//fmt.Printf("X is: %s, Y is: %d", f.X, f.Y)
fmt.Println("Do()\r\n")
}
func (f Foo) Doa(str string) {
//fmt.Printf("X is: %s, Y is: %d", f.X, f.Y)
fmt.Println("Doa()\r\n", str)
}
func (f Foo) Dob() {
//fmt.Printf("X is: %s, Y is: %d", f.X, f.Y)
fmt.Println("Dob()\r\n")
}
func (f *Foo) Doc() {
//fmt.Printf("X is: %s, Y is: %d", f.X, f.Y)
fmt.Println("Doc()\r\n")
}
func main() {
var f Foo = Foo{"1", 2}
typ := reflect.TypeOf(f)
typa := reflect.TypeOf(&f)
fmt.Println(typ.NumMethod(), typa.NumMethod()) //2 4
m := typ.Method(0)
fmt.Println(m.Name)
fmt.Println(m.Type)
fmt.Println(m.Func)
fmt.Println(m.Index)
m = typ.Method(1)
fmt.Println(m.Name)
fmt.Println(m.Type)
fmt.Println(m.Func)
fmt.Println(m.Index)
fmt.Println("___________________________________________________________________\r\n")
m = typa.Method(0)
fmt.Println(m.Name)
fmt.Println(m.Type)
fmt.Println(m.Func)
fmt.Println(m.Index)
m = typa.Method(1)
fmt.Println(m.Name)
fmt.Println(m.Type)
fmt.Println(m.Func)
fmt.Println(m.Index)
m = typa.Method(2)
fmt.Println(m.Name)
fmt.Println(m.Type)
fmt.Println(m.Func)
fmt.Println(m.Index)
m = typa.Method(3)
fmt.Println(m.Name)
fmt.Println(m.Type)
fmt.Println(m.Func)
fmt.Println(m.Index)
}
</code></pre>
程序的输出为:
<pre><code>
2 4
Doa
func(main.Foo, string)
0x4c3490
0
Dob
func(main.Foo)
0x4c3570
1
___________________________________________________________________
Do
func(*main.Foo)
0x4c3410
0
Doa
func(*main.Foo, string)
0x4c46e0
1
Dob
func(*main.Foo)
0x4c4780
2
Doc
func(*main.Foo)
0x4c35f0
3
</code></pre>
<pre><code>
问题1:
fmt.Println(typ.NumMethod(), typa.NumMethod()) 的输出为什么是2和4?
问题2:
为什么会有两个Dob,一个Type是func(*main.Foo)一个是func(main.Foo)?
</code></pre>
有疑问加站长微信联系(非本文作者)