| 162 | } |
| 163 | |
| 164 | func Slice(array, from, to any) any { |
| 165 | v := reflect.ValueOf(array) |
| 166 | |
| 167 | switch v.Kind() { |
| 168 | case reflect.Array, reflect.Slice, reflect.String: |
| 169 | length := v.Len() |
| 170 | a, b := ToInt(from), ToInt(to) |
| 171 | if a < 0 { |
| 172 | a = length + a |
| 173 | } |
| 174 | if a < 0 { |
| 175 | a = 0 |
| 176 | } |
| 177 | if b < 0 { |
| 178 | b = length + b |
| 179 | } |
| 180 | if b < 0 { |
| 181 | b = 0 |
| 182 | } |
| 183 | if b > length { |
| 184 | b = length |
| 185 | } |
| 186 | if a > b { |
| 187 | a = b |
| 188 | } |
| 189 | if v.Kind() == reflect.Array && !v.CanAddr() { |
| 190 | newValue := reflect.New(v.Type()).Elem() |
| 191 | newValue.Set(v) |
| 192 | v = newValue |
| 193 | } |
| 194 | value := v.Slice(a, b) |
| 195 | if value.IsValid() { |
| 196 | return value.Interface() |
| 197 | } |
| 198 | |
| 199 | case reflect.Ptr: |
| 200 | value := v.Elem() |
| 201 | if value.IsValid() { |
| 202 | return Slice(value.Interface(), from, to) |
| 203 | } |
| 204 | |
| 205 | } |
| 206 | panic(fmt.Sprintf("cannot slice %v", from)) |
| 207 | } |
| 208 | |
| 209 | func In(needle any, array any) bool { |
| 210 | if array == nil { |