main.go
package main import ( "fmt" "http2/comm" "http2/test" "net/http" "reflect" "strings" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if strings.HasPrefix(r.URL.Path, "/www/") { fmt.Fprint(w, "hellow www") } else { var appf = comm.Controller{ W: w, } var apps = test.Test{ Controller: appf, } var appp = new(test.Test) appp.W = w fmt.Println(reflect.TypeOf(apps)) v := reflect.ValueOf(apps) fmt.Println(v) t := reflect.TypeOf(apps) path := strings.Split(r.URL.Path, "/") cname := path[1] method, exist := t.MethodByName(cname) fmt.Println(exist) if exist { args := []reflect.Value{v} fmt.Println(args, 1111111111) method.Func.Call(args) } else { w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, "method not found ", r.URL.Path) } } }) err := http.ListenAndServe("127.0.0.1:8882", nil) if err != nil { fmt.Println(err) } }
comm.go
package comm import ( "fmt" "net/http" ) type Controller struct { W http.ResponseWriter } func (c Controller) Say() { fmt.Fprint(c.W, "hello contorller123") } func (c Controller) TestSay() { fmt.Fprintf(c.W, "hellow say") }
test.go
package test import ( "fmt" "http2/comm" ) type Test struct { comm.Controller } func (t Test) testsay() { fmt.Fprint(t.W, "hello test") }