diff --git a/README.md b/README.md
index 239eedc..bf6d5df 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@

-[](https://github.com/duke-git/lancet/releases)
+[](https://github.com/duke-git/lancet/releases)
[](https://pkg.go.dev/github.com/duke-git/lancet/v2)
[](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
diff --git a/README_zh-CN.md b/README_zh-CN.md
index 7a60211..2c7bb84 100644
--- a/README_zh-CN.md
+++ b/README_zh-CN.md
@@ -4,7 +4,7 @@

-[](https://github.com/duke-git/lancet/releases)
+[](https://github.com/duke-git/lancet/releases)
[](https://pkg.go.dev/github.com/duke-git/lancet/v2)
[](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
diff --git a/datastructure/queue/arrayqueue.go b/datastructure/queue/arrayqueue.go
index d15e933..4532894 100644
--- a/datastructure/queue/arrayqueue.go
+++ b/datastructure/queue/arrayqueue.go
@@ -60,7 +60,7 @@ func (q *ArrayQueue[T]) Front() T {
// Back return back value of queue
func (q *ArrayQueue[T]) Back() T {
- return q.data[q.size-1]
+ return q.data[q.tail-1]
}
// EnQueue put element into queue
diff --git a/netutil/net.go b/netutil/net.go
index 23af993..1b3b2fe 100644
--- a/netutil/net.go
+++ b/netutil/net.go
@@ -365,7 +365,7 @@ func validateScheme(scheme string) error {
return nil
}
-var hostRegex = regexp.MustCompile(`^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])(\.[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])*$`)
+var hostRegex = regexp.MustCompile(`^([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]?)(\.[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]?)+$`)
var pathRegex = regexp.MustCompile(`^\/([a-zA-Z0-9%_-]+(?:\/[a-zA-Z0-9%_-]+)*)$`)
var alphaNumericRegex = regexp.MustCompile(`^[a-zA-Z0-9]+$`)
diff --git a/netutil/net_test.go b/netutil/net_test.go
index 9b89e85..a080a48 100644
--- a/netutil/net_test.go
+++ b/netutil/net_test.go
@@ -196,6 +196,14 @@ func TestBuildUrl(t *testing.T) {
want: "https://www.test.com/path%20with%20spaces",
wantErr: false,
},
+ {
+ scheme: "https",
+ host: "my.api.edu.cn",
+ path: "/api",
+ query: nil,
+ want: "https://my.api.edu.cn/api",
+ wantErr: false,
+ },
}
for _, tt := range tests {
diff --git a/retry/retry.go b/retry/retry.go
index a30e6a1..c5533c1 100644
--- a/retry/retry.go
+++ b/retry/retry.go
@@ -128,9 +128,10 @@ func Retry(retryFunc RetryFunc, opts ...Option) error {
}
var i uint
+ var lastErr error
for i < config.retryTimes {
- err := retryFunc()
- if err == nil {
+ lastErr = retryFunc()
+ if lastErr == nil {
return nil
}
@@ -148,7 +149,7 @@ func Retry(retryFunc RetryFunc, opts ...Option) error {
lastSlash := strings.LastIndex(funcPath, "/")
funcName := funcPath[lastSlash+1:]
- return fmt.Errorf("function %s run failed after %d times retry", funcName, i)
+ return fmt.Errorf("function %s run failed after %d times retry, last error: %w", funcName, i, lastErr)
}
// BackoffStrategy is an interface that defines a method for calculating backoff intervals.
diff --git a/retry/retry_example_test.go b/retry/retry_example_test.go
index 3c9cbeb..20cfcda 100644
--- a/retry/retry_example_test.go
+++ b/retry/retry_example_test.go
@@ -118,7 +118,7 @@ func ExampleRetryTimes() {
}
// Output:
- // function retry.ExampleRetryTimes.func1 run failed after 2 times retry
+ // function retry.ExampleRetryTimes.func1 run failed after 2 times retry, last error: error occurs
}
func ExampleRetry() {
diff --git a/retry/retry_test.go b/retry/retry_test.go
index 125c2bc..ac2aac7 100644
--- a/retry/retry_test.go
+++ b/retry/retry_test.go
@@ -15,14 +15,16 @@ func TestRetryFailed(t *testing.T) {
assert := internal.NewAssert(t, "TestRetryFailed")
var number int
+ customError := errors.New("error occurs")
increaseNumber := func() error {
number++
- return errors.New("error occurs")
+ return customError
}
err := Retry(increaseNumber, RetryWithLinearBackoff(time.Microsecond*50))
assert.IsNotNil(err)
+ assert.Equal(errors.Is(err, customError), true)
assert.Equal(DefaultRetryTimes, number)
}