Получение и установка длины произвольного среза - PullRequest
0 голосов
/ 19 марта 2020

Чтобы получить длину любого среза, я использую reflect.ValueOf(slice).Len(). Чтобы задать длину любого среза, я использую reflect.ValueOf(&slice).Elem().SetLen(n).

. В моей структуре есть поле типа reflect.Value, а значение установлено на reflect.ValueOf(&slice), чтобы я мог изменить срез. Но теперь я не могу получить длину нижележащего среза.

Из-за call of reflect.Value.Len on ptr Value, если я позвоню напрямую Len(), будет * * * * * *, если я вызову Elem().Len().

Ниже приведена функция, которую я пытался реализовать:

func pop(slice interface{}) interface{} {
    v := reflect.ValueOf(slice)
    length := v.Len()
    last := v.Index(length - 1)
    v.SetLen(length - 1)
    return last
}

Как я могу сделать оба с refect.Value указателя слайса?

1 Ответ

1 голос
/ 19 марта 2020

Напишите функцию для работы с указателем на аргумент слайса.

// pop removes and returns the last element from
// the slice pointed to by slicep.
func pop(slicep interface{}) interface{} {
    v := reflect.ValueOf(slicep).Elem()
    length := v.Len()
    last := v.Index(length - 1)
    v.SetLen(length - 1)
    return last
}

Назовите ее так:

slice := []int{1, 2, 3}
last := pop(&slice)
fmt.Println(last)  // prints 3
fmt.Println(slice) // prints [1 2]

Запустите ее на детской площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...