diff --git a/_test/cli6.go b/_test/cli6.go new file mode 100644 index 00000000..89ae9f8b --- /dev/null +++ b/_test/cli6.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "net/http/httptest" +) + +type T struct { + http.ResponseWriter +} + +type mw1 struct { + next http.Handler +} + +func (m *mw1) ServeHTTP(rw http.ResponseWriter, rq *http.Request) { + t := &T{ + ResponseWriter: rw, + } + x := t.Header() + fmt.Fprint(rw, "Welcome to my website!", x) +} + +func main() { + m1 := &mw1{} + + mux := http.NewServeMux() + mux.HandleFunc("/", m1.ServeHTTP) + + server := httptest.NewServer(mux) + defer server.Close() + + client(server.URL) +} + +func client(uri string) { + resp, err := http.Get(uri) + if err != nil { + log.Fatal(err) + } + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + fmt.Println(string(body)) +} + +// Output: +// Welcome to my website!map[] diff --git a/interp/type.go b/interp/type.go index c890a6ed..e5f12757 100644 --- a/interp/type.go +++ b/interp/type.go @@ -1244,21 +1244,19 @@ func (t *itype) lookupBinMethod(name string) (m reflect.Method, index []int, isP if t.cat == ptrT { return t.val.lookupBinMethod(name) } + for i, f := range t.field { + if f.embed { + if m2, index2, isPtr2, ok2 := f.typ.lookupBinMethod(name); ok2 { + index = append([]int{i}, index2...) + return m2, index, isPtr2, ok2 + } + } + } m, ok = t.TypeOf().MethodByName(name) if !ok { m, ok = reflect.PtrTo(t.TypeOf()).MethodByName(name) isPtr = ok } - if !ok { - for i, f := range t.field { - if f.embed { - if m2, index2, isPtr2, ok2 := f.typ.lookupBinMethod(name); ok2 { - index = append([]int{i}, index2...) - return m2, index, isPtr2, ok2 - } - } - } - } return m, index, isPtr, ok }