Добавить [] байтов добавить слайс [] байтов - PullRequest
0 голосов
/ 19 апреля 2019

Я начал изучать язык ГО и не совсем что-то понимаю, может я просто растерялся и устал.Вот мой код, есть массив результатов (из закодированных строк, размер 2139614 элементов).Мне нужно расшифровать их и использовать их дальше.Но когда я запускаю итерацию, результат в два раза больше, а первая половина полностью пуста.Поэтому я делаю срез и добавляю к нему нужный диапазон.

Почему это происходит?

Возможно, было бы проще немедленно декодировать результат и перезаписать его, но я не знаю, как это сделать, хорошо)))

может быть, есть совершенно другой способ икак новичок я еще не знаю

        result := []string{}

    for i, _ := range input {
        result = append(result, i)
    }
    sort.Strings(result)

    rips := make([][]byte, 2139614)

    for _, i := range result {
        c := Decode(i)
        c = c[1:37]
        rips = append(rips, c)
    }
        //len(result) == 2139614

    for i := 2139610; i < 2139700; i++ {
        fmt.Println(i, rips[i])
    }

    resultrips := rips[2139614:]
    for _,i := range resultrips {
        fmt.Println(i)
    }

    fmt.Println("All write: ", len(resultrips))

и этот вопрос: я делаю это правильно, если мне нужен массив байтовых массивов (я делаю это так, чтобы не делать слишком много работы и проверюзначения в байтах, потому что нет никакой кодировки) ???

rips := make([][]byte, 2139614) // array [] byte

в конце концов, мне нужен массив типа наборав C ++, чтобы проверить, есть ли элемент в моем наборе в C ++, это был код: if (resultrips.count > 0) { ... }

1 Ответ

2 голосов
/ 19 апреля 2019

Когда вы пишете:

make([][]byte, 2139614)

Это создает срез длиной и емкостью, равной 2139614.Когда вы append добавляете к срезу, он всегда добавляется после последнего элемента, тем самым увеличивая длину .Если вы хотите предварительно выделить большой фрагмент, чтобы вы могли добавить в него, вы хотите указать длину 0:

make([][]byte, 0, 2139614)

Это предварительно выделяет 2139614 элементов, но с длиной0, последующие append вызовы начнутся с начала среза;после первого добавления он будет иметь длину 1, и ему не нужно будет увеличивать свою емкость.

Длина по сравнению с пропускной способностью описана в Tour of Go: https://tour.golang.org/moretypes/13

Краткое примечание на основе текста вашего вопроса - помните, что срезы и массивы - это не одно и то же .Массивы имеют фиксированную длину во время компиляции, а их емкость является синонимом их длины.Срезы поддерживаются массивами, но имеют динамическую независимую длину и емкость во время выполнения.

...