从恐慌中恢复的主要测试与测试之间的区别?

I have the following snippet which recovers from index out of range panics

Playground, also pasted below

The error is nil when called from main but not nil in an equivalent test case. What's the difference ?

type Foo struct {
    Is []int
}

func main() {
    fp := &Foo{}
    if err := fp.Panic(); err != nil {
        fmt.Errorf("Error: %v", err)
    } 
    fmt.Println("ok")
}

func (fp *Foo) Panic() (err error) {
    defer PanicRecovery(&err)
    fp.Is[0] = 5
    return nil
}

func PanicRecovery(err *error) {

        if r := recover(); r != nil {
                if _, ok := r.(runtime.Error); ok {
            //fmt.Println("Panicing")
                    *err = r.(error) //panic(r)
                } else {
            *err = r.(error)
        }
    }
}

Test case:

func TestPanic(t *testing.T) {
    fp := &Foo{}
    if err := fp.Panic(); err != nil {
        t.Errorf("Panic: %v", err)
    }
}

Change the nested line of your main function from:

fmt.Errorf("Error: %v", err)

To:

fmt.Printf("Error: %v", err)

Notice that the "Errorf" function doesn't print anything to stdout. It creates an error by formatting the text and arguments you provide and simply returns that error. What you really want is "fmt.Printf".