Просто передайте generateError в качестве аргумента (я упростил функцию повтора, потому что ничего не мог с собой поделать):
package main
import (
"errors"
"fmt"
"time"
)
func main() {
retry(generateError)
}
func retry(f func() error) {
fmt.Println("start!")
backoff := []time.Duration{
1 * time.Second,
5 * time.Second,
10 * time.Second,
}
var err error
for _, d := range backoff {
err = f()
if err != nil {
fmt.Printf("sleeping for %v...\n", d)
time.Sleep(d)
} else {
fmt.Println("no errors!")
return
}
}
fmt.Println("error:", err)
fmt.Println("done!")
}
func generateError() error {
err := errors.New("something happened")
return err
}