Open myml opened 5 years ago
使用未导出字段
package main import ( "context" "flag" "fmt" "log" "net/http" "reflect" "sync" "testing" "unsafe" ) func TestRunMain(t *testing.T) { main() } func TestMain(m *testing.M) { flag.Set("test.coverprofile", "c.out") mux := http.NewServeMux() mux.HandleFunc("/coverprofile", func(resp http.ResponseWriter, req *http.Request) { log.Printf("coverage %v", testing.Coverage()) }) mux.HandleFunc("/shutdown", func(resp http.ResponseWriter, req *http.Request) { err := srv.Shutdown(context.TODO()) if err != nil { fmt.Fprint(resp, err) resp.WriteHeader(500) } }) go func() { for { code := m.Run() log.Println("code", code) v := reflect.ValueOf(m).Elem() afterOnce := v.FieldByName("afterOnce") afterOnce = reflect.NewAt(afterOnce.Type(), unsafe.Pointer(afterOnce.UnsafeAddr())).Elem() afterOnce.Set(reflect.ValueOf(sync.Once{})) } }() http.ListenAndServe(":9222", mux) }
使用未导出函数
package main import ( "context" "flag" "fmt" "log" "net/http" "testing" _ "unsafe" ) //go:linkname coverReport testing.coverReport func coverReport() func TestRunMain(t *testing.T) { main() } func TestMain(m *testing.M) { flag.Set("test.coverprofile", "c.out") mux := http.NewServeMux() mux.HandleFunc("/coverprofile", func(resp http.ResponseWriter, req *http.Request) { log.Printf("coverage %v", testing.Coverage()) }) mux.HandleFunc("/coverReport", func(resp http.ResponseWriter, req *http.Request) { coverReport() }) mux.HandleFunc("/shutdown", func(resp http.ResponseWriter, req *http.Request) { err := srv.Shutdown(context.TODO()) if err != nil { fmt.Fprint(resp, err) resp.WriteHeader(500) } }) go func() { m.Run() }() http.ListenAndServe(":9222", mux) }
使用未导出字段
使用未导出函数