Go-библиотека для поиска элемента в срезе или работы с множествами, включая объединение, пересечение и разность.
Поддерживает не только встроенные типы, такие как []int/[]*int
, []float/[]*float
, []string/[]*string
, но и []struct/[]*struct
. Последнее является очень важным и удобным.
Стандартная команда go get
:
$ go get -v -u github.com/1046102779/slicelement
// находит элемент, существует ли он в данных, если существует, возвращает true, nil
func Contains(data interface{}, elem interface{}, tag string) (bool, error)
// получает индекс элемента в данных, если не существует, возвращает -1, nil.
func GetIndex(data interface{}, elem interface{}, tag string) (int, error)
// разность множеств, формула: dataC = dataA - dataB
// Параметр tag: уникальный ключ. Если нет, то может быть перекрыто.
// Например, тип User struct { UserId int, Name string, Tel string, Sex int16}
// var ( usersA, usersB []*User )
func GetDifference(dataA interface{}, dataB interface{}, tag string) (interface{}, error)
// пересечение множеств, формула: dataC = dataA ∩ dataB , также поддерживает срез структуры
// Параметр tag: уникальный ключ. Если нет, то может быть перекрыто.
// Например, тип User struct { UserId int, Name string, Tel string, Sex int16}
// var ( usersA, usersB []*User )
func GetInteraction(dataA interface{}, dataB interface{}, tagName string) (interface{}, error)
// объединение множеств, формула: dataC = dataA U dataB
// Параметр tag: уникальный ключ. Если нет, то может быть перекрыто.
// Например, тип User struct { UserId int, Name string, Tel string, Sex int16}
// var ( usersA, usersB []*User )
func GetUnion(dataA interface{}, dataB interface{}, tagName string) ( interface{}, error)
описание: если тип данных не []*struct/[]struct, значение тега пусто
Для использования и примеров см. Godoc.
data := []*Person{
&Person{
Name: "John",
Age: 29,
Children: []string{"David", "Lily", "Bruce Lee"},
},
&Person{
Name: "Joe",
Age: 18,
Children: []string{},
},
}
elem := 18
index, err := slicelement.GetIndex(data, elem, "Age")
if err != nil {
fmt.Println(err.Error())
}
fmt.Println("index=", index)
// вывод: index=1
type Student struct {
Name string
Age int
}
studentA := []Student{ studentB := []Student{
Student{ Student{
Name: "donghai", Name: "Joe",
Age: 29, Age: 18,
}, },
Student{ Student{
Name: "jixaing", Name: "David",
Age: 19, Age: 19,
}, },
} }
if studentC, err := slicelement.GetUnion(studentA, studentB, "Age"); err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("result: ", studentC)
}
// результат: [{donghai 29} {jixaing 19} {Joe 18}]
// {"David", 19} перекрывается {"jixiang", 19}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )