mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-10 15:52:27 +08:00
feat: add ConcatBy
This commit is contained in:
@@ -107,6 +107,7 @@ import (
|
|||||||
- [LeftPadding](#LeftPadding)
|
- [LeftPadding](#LeftPadding)
|
||||||
- [Frequency](#Frequency)
|
- [Frequency](#Frequency)
|
||||||
- [JoinFunc](#JoinFunc)
|
- [JoinFunc](#JoinFunc)
|
||||||
|
- [ConcatBy](#ConcatBy)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
@@ -3016,4 +3017,51 @@ func main() {
|
|||||||
// Output:
|
// Output:
|
||||||
// A, B, C
|
// A, B, C
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ConcatBy">ConcatBy</span>
|
||||||
|
|
||||||
|
<p>将切片中的元素连接成一个值,使用指定的分隔符和连接器函数。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ConcatBy[T any](slice []T, sep T, connector func(T, T) T) T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
Age int
|
||||||
|
}
|
||||||
|
|
||||||
|
people := []Person{
|
||||||
|
{Name: "Alice", Age: 30},
|
||||||
|
{Name: "Bob", Age: 25},
|
||||||
|
{Name: "Charlie", Age: 35},
|
||||||
|
}
|
||||||
|
|
||||||
|
sep := Person{Name: " | ", Age: 0}
|
||||||
|
|
||||||
|
personConnector := func(a, b Person) Person {
|
||||||
|
return Person{Name: a.Name + b.Name, Age: a.Age + b.Age}
|
||||||
|
}
|
||||||
|
|
||||||
|
result := slice.ConcatBy(people, sep, personConnector)
|
||||||
|
|
||||||
|
fmt.Println(result.Name)
|
||||||
|
fmt.Println(result.Age)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Alice | Bob | Charlie
|
||||||
|
// 90
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -106,6 +106,10 @@ import (
|
|||||||
- [RightPadding](#RightPadding)
|
- [RightPadding](#RightPadding)
|
||||||
- [LeftPadding](#LeftPadding)
|
- [LeftPadding](#LeftPadding)
|
||||||
- [Frequency](#Frequency)
|
- [Frequency](#Frequency)
|
||||||
|
- [JoinFunc](#JoinFunc)
|
||||||
|
- [ConcatBy](#ConcatBy)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -3009,4 +3013,51 @@ func main() {
|
|||||||
// Output:
|
// Output:
|
||||||
// A, B, C
|
// A, B, C
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ConcatBy">ConcatBy</span>
|
||||||
|
|
||||||
|
<p>Concats the elements of a slice into a single value using the provided separator and connector function.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ConcatBy[T any](slice []T, sep T, connector func(T, T) T) T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
Age int
|
||||||
|
}
|
||||||
|
|
||||||
|
people := []Person{
|
||||||
|
{Name: "Alice", Age: 30},
|
||||||
|
{Name: "Bob", Age: 25},
|
||||||
|
{Name: "Charlie", Age: 35},
|
||||||
|
}
|
||||||
|
|
||||||
|
sep := Person{Name: " | ", Age: 0}
|
||||||
|
|
||||||
|
personConnector := func(a, b Person) Person {
|
||||||
|
return Person{Name: a.Name + b.Name, Age: a.Age + b.Age}
|
||||||
|
}
|
||||||
|
|
||||||
|
result := slice.ConcatBy(people, sep, personConnector)
|
||||||
|
|
||||||
|
fmt.Println(result.Name)
|
||||||
|
fmt.Println(result.Age)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Alice | Bob | Charlie
|
||||||
|
// 90
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -1411,3 +1411,22 @@ func JoinFunc[T any](slice []T, sep string, transform func(T) T) string {
|
|||||||
}
|
}
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConcatBy concats the elements of a slice into a single value using the provided separator and connector function.
|
||||||
|
// Play: todo
|
||||||
|
func ConcatBy[T any](slice []T, sep T, connector func(T, T) T) T {
|
||||||
|
var result T
|
||||||
|
|
||||||
|
if len(slice) == 0 {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range slice {
|
||||||
|
result = connector(result, v)
|
||||||
|
if i < len(slice)-1 {
|
||||||
|
result = connector(result, sep)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|||||||
@@ -1272,3 +1272,31 @@ func ExampleJoinFunc() {
|
|||||||
// Output:
|
// Output:
|
||||||
// A, B, C
|
// A, B, C
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleConcatBy() {
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
Age int
|
||||||
|
}
|
||||||
|
|
||||||
|
people := []Person{
|
||||||
|
{Name: "Alice", Age: 30},
|
||||||
|
{Name: "Bob", Age: 25},
|
||||||
|
{Name: "Charlie", Age: 35},
|
||||||
|
}
|
||||||
|
|
||||||
|
sep := Person{Name: " | ", Age: 0}
|
||||||
|
|
||||||
|
personConnector := func(a, b Person) Person {
|
||||||
|
return Person{Name: a.Name + b.Name, Age: a.Age + b.Age}
|
||||||
|
}
|
||||||
|
|
||||||
|
result := ConcatBy(people, sep, personConnector)
|
||||||
|
|
||||||
|
fmt.Println(result.Name)
|
||||||
|
fmt.Println(result.Age)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Alice | Bob | Charlie
|
||||||
|
// 90
|
||||||
|
}
|
||||||
|
|||||||
@@ -1856,3 +1856,41 @@ func TestJoinFunc(t *testing.T) {
|
|||||||
assert.Equal(expected, result)
|
assert.Equal(expected, result)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConcatBy(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestConcatBy")
|
||||||
|
|
||||||
|
t.Run("Join strings", func(t *testing.T) {
|
||||||
|
result := ConcatBy([]string{"Hello", "World"}, ", ", func(a, b string) string {
|
||||||
|
return a + b
|
||||||
|
})
|
||||||
|
|
||||||
|
expected := "Hello, World"
|
||||||
|
assert.Equal(expected, result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Join Person struct", func(t *testing.T) {
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
Age int
|
||||||
|
}
|
||||||
|
|
||||||
|
people := []Person{
|
||||||
|
{Name: "Alice", Age: 30},
|
||||||
|
{Name: "Bob", Age: 25},
|
||||||
|
{Name: "Charlie", Age: 35},
|
||||||
|
}
|
||||||
|
sep := Person{Name: " | ", Age: 0}
|
||||||
|
|
||||||
|
personConnector := func(a, b Person) Person {
|
||||||
|
return Person{Name: a.Name + b.Name, Age: a.Age + b.Age}
|
||||||
|
}
|
||||||
|
|
||||||
|
result := ConcatBy(people, sep, personConnector)
|
||||||
|
|
||||||
|
assert.Equal("Alice | Bob | Charlie", result.Name)
|
||||||
|
assert.Equal(90, result.Age)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user