diff --git a/docs/api/packages/strutil.md b/docs/api/packages/strutil.md index ad032f5..645a2cd 100644 --- a/docs/api/packages/strutil.md +++ b/docs/api/packages/strutil.md @@ -62,6 +62,7 @@ import ( - [RemoveWhiteSpace](#RemoveWhiteSpace) - [SubInBetween](#SubInBetween) - [HammingDistance](#HammingDistance) +- [Concat](#Concat)
@@ -1528,4 +1529,38 @@ func main() { // 0 // 1 } + +``` +### Concat + +拼接字符串。length是拼接后字符串的长度,如果不确定则传0或负数。
+ +函数签名: + +```go +func Concat(length int, str ...string) string +``` + +示例:[运行]() + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/strutil" +) + +func main() { + + result1 := strutil.Concat(12, "Hello", " ", "World", "!") + result2 := strutil.Concat(11, "Go", " ", "Language") + result3 := strutil.Concat(0, "An apple a ", "day,", "keeps the", " doctor away") + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + + // Output: + // Hello World! + // Go Language + // An apple a day,keeps the doctor away +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/strutil.md b/docs/en/api/packages/strutil.md index 43b370e..471e523 100644 --- a/docs/en/api/packages/strutil.md +++ b/docs/en/api/packages/strutil.md @@ -62,6 +62,7 @@ import ( - [RemoveWhiteSpace](#RemoveWhiteSpace) - [SubInBetween](#SubInBetween) - [HammingDistance](#HammingDistance) +- [Concat](#Concat) @@ -1477,7 +1478,7 @@ func main() { func SubInBetween(str string, start string, end string) string ``` -Example:[运行](https://go.dev/play/p/EDbaRvjeNsv) +Example:[Run](https://go.dev/play/p/EDbaRvjeNsv) ```go import ( @@ -1510,7 +1511,7 @@ func main() { func HammingDistance(a, b string) (int, error) ``` -Example:[运行](https://go.dev/play/p/glNdQEA9HUi) +Example:[Run](https://go.dev/play/p/glNdQEA9HUi) ```go import ( @@ -1530,4 +1531,39 @@ func main() { // 0 // 1 } +``` + + +### Concat + +Concatenates strings. length is the length of the concatenated string. If unsure, pass 0 or a negative number.
+ +Signature: + +```go +func Concat(length int, str ...string) string +``` + +Example:[Run]() + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/strutil" +) + +func main() { + + result1 := strutil.Concat(12, "Hello", " ", "World", "!") + result2 := strutil.Concat(11, "Go", " ", "Language") + result3 := strutil.Concat(0, "An apple a ", "day,", "keeps the", " doctor away") + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + + // Output: + // Hello World! + // Go Language + // An apple a day,keeps the doctor away +} ``` \ No newline at end of file diff --git a/strutil/string.go b/strutil/string.go index e174ce9..72846f8 100644 --- a/strutil/string.go +++ b/strutil/string.go @@ -617,3 +617,24 @@ func HammingDistance(a, b string) (int, error) { return distance, nil } + +// Concat uses the strings.Builder to concatenate the input strings. +// - `length` is the expected length of the concatenated string. +// - if you are unsure about the length of the string to be concatenated, please pass 0 or a negative number. +func Concat(length int, str ...string) string { + if len(str) == 0 { + return "" + } + + sb := strings.Builder{} + if length <= 0 { + sb.Grow(len(str[0]) * len(str)) + } else { + sb.Grow(length) + } + + for _, s := range str { + sb.WriteString(s) + } + return sb.String() +} diff --git a/strutil/string_example_test.go b/strutil/string_example_test.go index a9bcb28..8eac765 100644 --- a/strutil/string_example_test.go +++ b/strutil/string_example_test.go @@ -680,3 +680,17 @@ func ExampleHammingDistance() { // 3 // 1 } + +func ExampleConcat() { + result1 := Concat(12, "Hello", " ", "World", "!") + result2 := Concat(11, "Go", " ", "Language") + result3 := Concat(0, "An apple a ", "day,", "keeps the", " doctor away") + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + + // Output: + // Hello World! + // Go Language + // An apple a day,keeps the doctor away +} diff --git a/strutil/string_test.go b/strutil/string_test.go index 3d94af0..6b2c8be 100644 --- a/strutil/string_test.go +++ b/strutil/string_test.go @@ -561,6 +561,7 @@ func TestContainsAny(t *testing.T) { } func TestRemoveWhiteSpace(t *testing.T) { + t.Parallel() assert := internal.NewAssert(t, "TestRemoveWhiteSpace") str := " hello \r\n \t world" @@ -571,6 +572,7 @@ func TestRemoveWhiteSpace(t *testing.T) { } func TestSubInBetween(t *testing.T) { + t.Parallel() assert := internal.NewAssert(t, "TestSubInBetween") str := "abcde" @@ -583,6 +585,7 @@ func TestSubInBetween(t *testing.T) { } func TestHammingDistance(t *testing.T) { + t.Parallel() assert := internal.NewAssert(t, "HammingDistance") hd := func(a, b string) int { @@ -604,3 +607,16 @@ func TestHammingDistance(t *testing.T) { assert.Equal(0, hd("日本語", "日本語")) assert.Equal(3, hd("日本語", "語日本")) } + +func TestConcat(t *testing.T) { + t.Parallel() + assert := internal.NewAssert(t, "TestConcat") + + assert.Equal("", Concat(0)) + assert.Equal("a", Concat(1, "a")) + assert.Equal("ab", Concat(2, "a", "b")) + assert.Equal("abc", Concat(3, "a", "b", "c")) + assert.Equal("abc", Concat(3, "a", "", "b", "c", "")) + assert.Equal("你好,世界!", Concat(0, "你好", ",", "", "世界!", "")) + assert.Equal("Hello World!", Concat(0, "Hello", " Wo", "r", "ld!", "")) +}