NewIntCollection([]int{1, 2})
intColl2 := intColl.Copy()
intColl2.DD()
if intColl2.Count() != 2 {
t.Fatal("Copy失败")
}
if reflect.TypeOf(intColl2) != reflect.TypeOf(intColl) {
t.Fatal("Copy类型失败")
}
}
Contain
Contains(obj interface{}) bool
Определяет, присутствует ли элемент в коллекции. Необходимо задать функцию сравнения.
intColl := NewIntCollection([]int{1, 2, 2, 3})
if intColl.Contains(1) != true {
t.Fatal("contain 错误1")
}
if intColl.Contains(5) != false {
t.Fatal("contain 错误2")
}
Diff
Diff(arr ICollection) ICollection
Возвращает элементы из первой коллекции, которых нет во второй. Необходимо задать функцию сравнения.
intColl := NewIntCollection([]int{1, 2, 2, 3})
intColl2 := NewIntCollection([]int{2, 3, 4})
diff := intColl.Diff(intColl2)
diff.DD()
if diff.Count() != 1 {
t.Fatal("diff 错误")
}
/*
IntCollection(1):{
0: 1
}
*/
DD
DD()
Метод DD отображает коллекцию в удобном формате.
a1 := Foo{A: "a1"}
a2 := Foo{A: "a2"}
objColl := NewObjCollection([]Foo{a1, a2})
objColl.DD()
/*
ObjCollection(2)(collection.Foo):{
0: {A:a1}
1: {A:a2}
}
*/
intColl := NewIntCollection([]int{1,2})
intColl.DD()
/*
IntCollection(2):{
0: 1
1: 2
}
*/
Each
Each(func(item interface{}, key int))
Вызывает заданную функцию для каждого элемента коллекции. Если необходимо прервать цикл, можно установить ошибку в коллекции.
intColl := NewIntCollection([]int{1, 2, 3, 4})
sum := 0
intColl.Each(func(item interface{}, key int) {
v := item.(int)
sum = sum + v
})
if intColl.Err() != nil {
t.Fatal(intColl.Err())
}
if sum != 10 {
t.Fatal("Each 错误")
}
sum = 0
intColl.Each(func(item interface{}, key int) {
v := item.(int)
sum = sum + v
if sum > 4 {
intColl.SetErr(errors.New("stop the cycle"))
return
}
})
if sum != 6 {
t.Fatal("Each 错误")
}
/*
PASS
*/
Every
Every(func(item interface{}, key int) bool) bool
Проверяет, все ли элементы коллекции соответствуют заданному условию. Возвращает true, если все элементы подходят, и false в противном случае.
intColl := NewIntCollection([]int{1, 2, 3, 4})
if intColl.Every(func(item interface{}, key int) bool {
i := item.(int)
return i > 1
}) != false {
t.Fatal("Every错误")
}
if intColl.Every(func(item interface{}, key int) bool {
i := item.(int)
return i > 0
}) != true {
t.Fatal("Every错误")
}
ForPage
ForPage(page int, perPage int) ICollection
Разделяет коллекцию на страницы по заданному количеству элементов на странице.
intColl := NewIntCollection([]int{1, 2, 3, 4, 5, 6})
ret := intColl.ForPage(1, 2)
ret.DD()
if ret.Count() != 2 {
t.Fatal("For page错误")
}
/*
IntCollection(2):{
0: 3
1: 4
}
*/
Filter
Filter(func(item interface{}, key int) bool) ICollection
Получает элементы коллекции, соответствующие заданной функции фильтрации.
intColl := NewIntCollection([]int{1, 2, 2, 3})
intColl.Filter(func(obj interface{}, index int) bool {
val := obj.(int)
if val == 2 {
return true
}
return false
}).DD()
/*
IntCollection(2):{
0: 2
1: 2
}
*/
First
First(...func(item interface{}, key int) bool) IMix
Получает первый элемент коллекции, соответствующий заданной функции фильтрации (если она указана).
intColl := NewIntCollection([]int{1, 2, 2, 3})
intColl.First(func(obj interface{}, index int) bool {
val := obj.(int)
if val > 2 {
return true
}
return false
}).DD()
/*
IMix(int): 3
*/
func TestIntCollection_Filter(t *testing.T) {
intColl := NewIntCollection([]int{1,2,3})
a, err := intColl.First().ToInt()
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(a, 1) {
t.Fatal("filter error")
}
}
Index
Index(i int) IMix
Получает элемент коллекции с заданным индексом (отсчёт начинается с нуля).
intColl := NewIntCollection([]int{1,2})
foo := intColl.Index(1)
foo.DD()
/*
IMix(int): 2
*/
IsEmpty
IsEmpty() bool
Проверяет, пуста ли коллекция. Возвращает true, если коллекция пуста, и false иначе.
intColl := NewIntCollection([]int{1,2})
println(intColl.IsEmpty()) // false
IsNotEmpty
IsNotEmpty() bool
Проверяет, не пуста ли коллекция. Возвращает true, если коллекция не пуста, и false иначе.
intColl := NewIntCollection([]int{1,2})
println(intColl.IsNotEmpty()) // true
Join
`Join(split string, format ...func(item
Примечание: в запросе присутствуют фрагменты кода на языке Go, но в ответе они не представлены в виде кода, а переведены на русский язык. Интерфейс
Объединяет элементы коллекции в строку определённым образом. Функция принимает один или два параметра: разделитель для объединения элементов и функция форматирования, которая применяется к каждому элементу при объединении. Если второй параметр не задан, используется функция fmt.Sprintf("%v") для форматирования.
intColl := NewIntCollection([]int{2, 4, 3})
out := intColl.Join(",")
if out != "2,4,3" {
t.Fatal("join错误")
}
out = intColl.Join(",", func(item interface{}) string {
return fmt.Sprintf("'%d'", item.(int))
})
if out != "'2','4','3'" {
t.Fatal("join 错误")
}
Последний
Получает последний элемент коллекции, который удовлетворяет условию фильтрации. Если условие фильтрации не задано, возвращает последний элемент по умолчанию.
intColl := NewIntCollection([]int{1, 2, 3, 4, 3, 2})
last, err := intColl.Last().ToInt()
if err != nil {
t.Fatal("last get error")
}
if last != 2 {
t.Fatal("last 获取错误")
}
last, err = intColl.Last(func(item interface{}, key int) bool {
i := item.(int)
return i > 2
}).ToInt()
if err != nil {
t.Fatal("last get error")
}
if last != 3 {
t.Fatal("last 获取错误")
}
Слияние
Сливает две коллекции, изменяя исходную.
intColl := NewIntCollection([]int{1, 2 })
intColl2 := NewIntCollection([]int{3, 4})
intColl.Merge(intColl2)
if intColl.Err() != nil {
t.Fatal(intColl.Err())
}
if intColl.Count() != 4 {
t.Fatal("Merge 错误")
}
intColl.DD()
/*
IntCollection(4):{
0: 1
1: 2
2: 3
3: 4
}
*/
Карта
Применяет функцию к каждому элементу коллекции и объединяет результаты в новую коллекцию. Если функция возвращает nil, элемент не включается в итоговую коллекцию.
Если во время вызова функции установить ошибку в коллекции, выполнение функции будет остановлено, и элемент также не будет включён в итоговую коллекцию.
intColl := NewIntCollection([]int{1, 2, 3, 4})
newIntColl := intColl.Map(func(item interface{}, key int) interface{} {
v := item.(int)
return v * 2
})
newIntColl.DD()
if newIntColl.Count() != 4 {
t.Fatal("Map错误")
}
newIntColl2 := intColl.Map(func(item interface{}, key int) interface{} {
v := item.(int)
if key > 2 {
intColl.SetErr(errors.New("break"))
return nil
}
return v * 2
})
newIntColl2.DD()
/*
IntCollection(4):{
0: 2
1: 4
2: 6
3: 8
}
IntCollection(3):{
0: 2
1: 4
2: 6
}
*/
Режим
Находит наиболее часто встречающееся значение в коллекции. Если есть несколько значений с одинаковой частотой, возвращается первое из них.
intColl := NewIntCollection([]int{1, 2, 2, 3, 4, 5, 6})
mode, err := intColl.Mode().ToInt()
if err != nil {
t.Fatal(err.Error())
}
if mode != 2 {
t.Fatal("Mode error")
}
intColl = NewIntCollection([]int{1, 2, 2, 3, 4, 4, 5, 6})
mode, err = intColl.Mode().ToInt()
if err != nil {
t.Fatal(err.Error())
}
if mode != 2 {
t.Fatal("Mode error")
}
Максимум
Возвращает максимальное значение в коллекции после сравнения элементов. Для этого необходимо задать функцию сравнения.
intColl := NewIntCollection([]int{1, 2, 2, 3})
max, err := intColl.Max().ToInt()
if err != nil {
t.Fatal(err)
}
if max != 3 {
t.Fatal("max错误")
}
Минимум
Возвращает минимальное значение в коллекции после сравнения элементов. Для этого необходимо задать функцию сравнения.
intColl := NewIntCollection([]int{1, 2, 2, 3})
min, err := intColl.Min().ToInt()
if err != nil {
t.Fatal(err)
}
if min != 1 {
t.Fatal("min错误")
}
Медиана
Находит среднее значение в отсортированной коллекции. Если коллекция содержит чётное количество элементов, возвращает среднее арифметическое двух средних элементов.
intColl := NewIntCollection([]int{1, 2, 2, 3})
median, err := intColl.Median().ToFloat64()
if err != nil {
t.Fatal(err)
}
if median != 2.0 {
t.Fatal("Median 错误" + fmt.Sprintf("%v", median))
}
NewEmpty
Создаёт пустую коллекцию того же типа, что и исходная.
intColl := NewIntCollection([]int{1,2})
intColl2 := intColl.NewEmpty()
intColl2.DD()
/*
IntCollection(0):{
}
*/
Nth
Извлекает каждый n-й элемент из коллекции, начиная с указанного смещения. Смещение по умолчанию равно нулю.
intColl := NewIntCollection([]int{1, 2, 3, 4, 5, 6})
ret := intColl.Nth(4, 1)
ret.DD()
if ret.Count() != 2 {
t.Fatal("Nth 错误")
}
/*
IntCollection(2):{
0: 2
1: 6
}
*/
Pad
Дополняет коллекцию элементами до указанной длины. Элементы добавляются справа, если первый параметр больше нуля, и слева, если меньше нуля.
**ret := intColl.Pad(5, 0)**
Если **ret.Err() != nil**, то:
t.Fatal(ret.Err().Error())
**ret.DD()**
Если **ret.Count() != 5**, то:
t.Fatal("Pad 错误")
**ret = intColl.Pad(-5, 0)**
Если **ret.Err() != nil**, то:
t.Fatal(ret.Err().Error())
**ret.DD()**
Если **ret.Count() != 5**, то:
t.Fatal("Pad 错误")
* * *
### Pop
**Pop() IMix**
Из коллекции справа выталкивается один элемент.
```go
intColl := NewIntCollection([]int {1, 2, 3, 4, 5, 6})
pop := intColl.Pop()
in, err := pop.ToInt()
if err != nil {
t.Fatal(err.Error())
}
if in != 6 {
t.Fatal("Pop 错误")
}
intColl.DD()
if intColl.Count() != 5 {
t.Fatal("Pop 后本体错误")
}
/*
IntCollection(5): {
0: 1
1: 2
2: 3
3: 4
4: 5
}
*/
Push(item interface{}) ICollection
В коллекцию справа вставляется один элемент.
intColl := NewIntCollection([]int {1, 2, 3, 4, 5, 6})
intColl.Push(7)
intColl.DD()
if intColl.Count() != 7 {
t.Fatal("Push 后本体错误")
}
/*
IntCollection(7): {
0: 1
1: 2
2: 3
3: 4
4: 5
5: 6
6: 7
}
Prepend(item interface{}) ICollection
К коллекции слева добавляется элемент.
intColl := NewIntCollection([]int {1, 2, 3, 4, 5, 6})
intColl.Prepend(0)
if intColl.Err() != nil {
t.Fatal(intColl.Err().Error())
}
intColl.DD()
if intColl.Count() != 7 {
t.Fatal("Prepend 错误")
}
/*
IntCollection(7): {
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
}
Pluck(key string) ICollection
Объект массива извлекается и формируется в новую коллекцию. Этот объект должен быть публичным элементом.
Примечание: эта функция действует только на ObjCollection.
type Foo struct {
A string
}
func TestObjCollection_Pluck(t *testing.T) {
a1 := Foo {A: "a1"}
a2 := Foo {A: "a2"}
objColl := NewObjCollection([]Foo {a1, a2})
objColl.Pluck("A").DD()
}
/*
StrCollection(2): {
0: a1
1: a2
}
Reject(func(item interface{}, key int) bool) ICollection
Элементы, удовлетворяющие условиям фильтрации, удаляются.
intColl := NewIntCollection([]int {1, 2, 3, 4, 5})
retColl := intColl.Reject(func (item interface{}, key int) bool {
i := item.(int)
return i > 3
})
if retColl.Count() != 3 {
t.Fatal("Reject 重复错误")
}
retColl.DD()
/*
IntCollection(3): {
0: 1
1: 2
2: 3
}
Reduce(func(carry IMix, item IMix) IMix) IMix
Все элементы коллекции объединяются.
Если вы хотите остановить вызов в определённое время, установите ошибку коллекции в это время, чтобы остановить вызов.
intColl := NewIntCollection ([]int {1, 2, 3, 4})
sumMix := intColl.Reduce(func (carry IMix, item IMix) IMix {
carryInt, _ := carry.ToInt()
itemInt, _ := item.ToInt()
return NewMix(carryInt + itemInt)
})
sumMix.DD()
sum, err := sumMix.ToInt()
if err != nil {
t.Fatal(err.Error())
}
if sum != 10 {
t.Fatal("Reduce 计算错误")
}
/*
IMix(int): 10
Random() IMix
Случайный выбор элемента из коллекции, случайное число семян использует метку времени.
intColl := NewIntCollection ([]int {1, 2, 3, 4, 5, 6})
out := intColl.Random()
out.DD()
_, err := out.ToInt()
if err != nil {
t.Fatal(err.Error())
}
/*
IMix(int): 5
Reverse() ICollection
Коллекция массивов переворачивается.
intColl := NewIntCollection ([]int {1, 2, 3, 4, 5, 6})
vs := intColl.Reverse()
vs.DD()
/*
IntCollection(6): {
0: 6
1: 5
2: 4
3: 3
4: 2
5: 1
}
Search(item interface{}) int
Найдите индекс первого совпадающего элемента запроса в коллекции. Если он существует, верните индекс; если нет, верните -1.
Обратите внимание, что для этой функции требуется установить метод сравнения, базовые элементы массива (int, int64, float32, float64, string) можно вызывать напрямую!
intColl := NewIntCollection ([]int {1,2})
if intColl.Search(2) != 1 {
t.Fatal("Search 错误")
}
intColl = NewIntCollection ([]int {1,2, 3, 3, 2})
if intColl.Search(3) != 2 {
t.Fatal("Search 重复错误")
}
Slice(...int) ICollection
Получите фрагмент коллекции. Можно указать два параметра или один параметр.
Если указаны два параметра, первый параметр представляет начальный индекс, а второй параметр представляет конечный индекс. Когда второй параметр равен -1, это означает до конца коллекции.
Если указан один параметр, это означает получение фрагмента от этого начального индекса до конца коллекции. retColl.DD()
retColl = intColl.Slice(2, -1)
Если retColl.Count() != 3, то:
t.Fatal("Slice второй параметр равен -1 ошибка")
retColl.DD()
IntCollection (3): { 0: 3 1: 4 2: 5 }
IntCollection (2): { 0: 3 1: 4 }
IntCollection (3): { 0: 3 1: 4 2: 5 }
Shuffle() ICollection
Производит случайное перемешивание элементов Collection с использованием в качестве случайного числа временной метки.
intColl := NewIntCollection([]int{1, 2, 2, 3})
newColl := intColl.Shuffle()
newColl.DD()
if newColl.Err() != nil {
t.Fatal(newColl.Err())
}
/*
IntCollection(4):{
0: 1
1: 3
2: 2
3: 2
}
*/
Sort() ICollection
Сортирует элементы Collection по возрастанию и выводит их. Необходимо задать функцию сравнения.
intColl := NewIntCollection([]int{2, 4, 3})
intColl2 := intColl.Sort()
if intColl2.Err() != nil {
t.Fatal(intColl2.Err())
}
intColl2.DD()
/*
IntCollection(3):{
0: 2
1: 3
2: 4
}
*/
SortDesc() ICollection
Сортирует элементы Collection по убыванию и выводит их. Необходимо задать функцию сравнения.
intColl := NewIntCollection([]int{2, 4, 3})
intColl2 := intColl.SortDesc()
if intColl2.Err() != nil {
t.Fatal(intColl2.Err()))
}
intColl2.DD()
/*
IntCollection(3):{
0: 4
1: 3
2: 2
}
Sum() IMix
Возвращает сумму элементов Collection.
intColl := NewIntCollection([]int{1, 2, 2, 3})
intColl.Sum().DD()
sum, err := intColl.Sum().ToInt()
if err != nil {
t.Fatal(err)
}
if sum != 8 {
t.Fatal("sum ошибка")
}
/*
IMix(int): 8
*/
SortBy(key string) ICollection
Осуществляет сортировку элементов Collection по возрастанию на основе одного из элементов объекта массива. Этот элемент должен быть публичным.
Примечание: эта функция действует только на ObjCollection. Элемент объекта массива должен быть базового типа.
type Foo struct {
A string
B int
}
func TestObjCollection_SortBy(t *testing.T) {
a1 := Foo{A: "a1", B: 3}
a2 := Foo{A: "a2", B: 2}
objColl := NewObjCollection([]Foo{a1, a2})
newObjColl := objColl.SortBy("B")
newObjColl.DD()
obj, err := newObjColl.Index(0).ToInterface()
if err != nil {
t.Fatal(err)
}
foo := obj.(Foo)
if foo.B != 2 {
t.Fatal("SortBy error")
}
}
/*
ObjCollection(2)(collection.Foo):{
0: {A:a2 B:2}
1: {A:a1 B:3}
}
SortByDesc(key string) ICollection
Осуществляет сортировку элементов Collection по убыванию на основе одного из элементов объекта массива. Этот элемент должен быть публичным.
Примечание: эта функция действует только на ObjCollection. Элемент объекта массива должен быть базового типа.
type Foo struct {
A string
B int
}
func TestObjCollection_SortByDesc(t *testing.T) {
a1 := Foo{A: "a1", B: 2}
a2 := Foo{A: "a2", B: 3}
objColl := NewObjCollection([]Foo{a1, a2})
newObjColl := objColl.SortByDesc("B")
newObjColl.DD()
obj, err := newObjColl.Index(0).ToInterface()
if err != nil {
t.Fatal(err)
}
foo := obj.(Foo)
if foo.B != 3 {
t.Fatal("SortBy error")
}
}
/*
ObjCollection(2)(collection.Foo):{
0: {A:a2 B:3}
1: {A:a1 B:2}
}
ToInts() ([]int, error)
Преобразует Collection в массив int. Если тип элемента Collection не соответствует или если в Collection есть ошибка, возвращается ошибка.
intColl := NewIntCollection([]int{1, 2, 2, 3})
arr, err := intColl.ToInts()
if err != nil {
t.Fatal(err)
}
if len(arr) != 4 {
t.Fatal(errors.New("ToInts error"))
}
ToInt64s() ([]int64, error)
Преобразует Collection в массив int64. Если тип элемента Collection не соответствует или если в Collection есть ошибка, возвращается ошибка.
intColl := NewInt64Collection([]int{1, 2, 2, 3})
arr, err := intColl.ToInts()
if err != nil {
t.Fatal(err)
}
if len(arr) != 4 {
t.Fatal(errors.New("ToInts error"))
}
ToFloat64s() ([]float64, error)
Преобразует Collection в массив float64. Если тип элемента Collection не соответствует или если в Collection есть ошибка, возвращается ошибка.
arr := NewFloat64Collection([]float64{1.0 ,2.0,3.0,4.0,5.0})
arr.DD()
max, err := arr.Max().ToFloat64()
if err != nil {
t.Fatal(err)
}
if max != 5 {
t.Fatal(errors.New("max error"))
}
arr2 := arr.Filter(func(obj interface{}, index int) bool {
val := obj.(float64)
if val > 2.0 {
return true
}
return false
})
if arr2.Count() != 3 {
t.Fatal(errors.New("filter error"))
}
out, err := arr2.ToFloat64s()
if err != nil || len(out) != 3 {
t.Fatal(errors.New("to float64s error"))
}
ToFloat32s() ([]float32, error)
Аналогично функции ToFloat64s, но преобразует элементы в тип float32. Текст запроса написан на языке Go.
Ниже представлен перевод текста запроса на русский язык:
Преобразование в массив float32
arr := NewFloat32Collection([]float32{1.0, 2.0, 3.0, 4.0, 5.0})
arr.DD()
max, err := arr.Max().ToFloat32()
if err != nil {
t.Fatal(err)
}
if max != 5 {
t.Fatal(errors.New("max error"))
}
arr2 := arr.Filter(func(obj interface{}, index int) bool {
val := obj.(float32)
if val > 2.0 {
return true
}
return false
})
if arr2.Count() != 3 {
t.Fatal(errors.New("filter error"))
}
out, err := arr2.ToFloat32s()
if err != nil || len(out) != 3 {
t.Fatal(errors.New("to float32s error"))
}
ToMixs
ToMixs() ([]IMix, error)
Преобразует коллекцию в массив Mix, если элементы коллекции не соответствуют типу или есть ошибка, то возвращает ошибку.
intColl := NewIntCollection([]int{1, 2, 2, 3})
arr, err := intColl.ToMixs()
if err != nil {
t.Fatal(err)
}
if len(arr) != 4 {
t.Fatal(errors.New("ToInts error"))
}
ToInterfaces
ToInterfaces() ([]interface{}, error)
Преобразовывает коллекцию в массив Interface{}, если элементы коллекции не соответствуют типу или есть ошибка, то возвращает ошибку.
Unique
Unique() ICollection
Объединяет повторяющиеся элементы в коллекции и возвращает уникальный массив.
Примечание: для этой функции требуется установить метод сравнения, базовые массивы элементов (int, int64, float32, float64, string) можно вызывать напрямую!
intColl := NewIntCollection([]int{1,2, 3, 3, 2})
uniqColl := intColl.Unique()
if uniqColl.Count() != 3 {
t.Fatal("Unique 重复错误")
}
uniqColl.DD()
/*
IntCollection(3):{
0: 1
1: 2
2: 3
}
*/
$ go test -bench=. -run=non
goos: darwin
goarch: amd64
pkg: github.com/jianfengye/collection
Benchmark_Append-12 3512688 387 ns/op
Benchmark_Contain-12 6727482 179 ns/op
Benchmark_Copy-12 7260177 159 ns/op
Benchmark_Diff-12 2310327 522 ns/op
Benchmark_Each-12 7784914 154 ns/op
Benchmark_Every-12 7602790 157 ns/op
Benchmark_ForPage-12 2355352 515 ns/op
Benchmark_Filter-12 1356804 876 ns/op
Benchmark_First-12 19379992 61.8 ns/op
Benchmark_Index-12 19259961 62.1 ns/op
Benchmark_IsEmpty-12 162860646 7.33 ns/op
Benchmark_IsNotEmpty-12 163036106 7.36 ns/op
Benchmark_Join-12 4705460 255 ns/op
Benchmark_Last-12 15544176 76.8 ns/op
Benchmark_Merge-12 1372609 872 ns/op
Benchmark_Map-12 2752177 439 ns/op
Benchmark_Max-12 3218686 372 ns/op
Benchmark_Min-12 3233270 372 ns/op
Benchmark_Median-12 1379985 869 ns/op
Benchmark_Nth-12 2360064 503 ns/op
Benchmark_Pop-12 1454916 834 ns/op
Benchmark_Push-12 3629934 346 ns/op
Benchmark_Prepend-12 10000 376298 ns/op
Benchmark_Pluck-12 2531895 469 ns/op
Benchmark_Reject-12 4184707 286 ns/op
Benchmark_Random-12 142698 8397 ns/op
Benchmark_Reverse-12 1324262 903 ns/op
Benchmark_Slice-12 2272142 515 ns/op
Benchmark_Search-12 6484984 186 ns/op
Benchmark_Sort-12 3627673 333 ns/op
Benchmark_SortDesc-12 3565390 331 ns/op
Benchmark_Shuffle-12 128826 9320 ns/op
Benchmark_SortBy-12 564669482 2.13 ns/op
Benchmark_SortByDesc-12 595491585 2.03 ns/op
Benchmark_Unique-12 1219267 979 ns/op
PASS
ok github.com/jianfengye/collection 59.484s
Лицензия
Коллекция (collection) лицензирована по Apache License.
Вкладчики
Этот проект существует благодаря всем людям, которые вносят свой вклад. [Внести свой вклад].
Спонсоры
Спасибо всем нашим спонсорам! 🙏 [Стать спонсором]
Поддержите этот проект, став спонсором. Ваш логотип будет отображаться здесь с ссылкой на ваш веб-сайт. Стать спонсором
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )