Pull to refresh

Comments 13

@andrey_shalamov Не могли бы вы пояснить механику работы вашей реализации Free List.

Как происходит, что память возвращается в список в методе Put, а не отбрасывается в ветке default?

Соответственно не понятен механизм выделения памяти из списка в методе Get.

основа - это работа с буферизированным каналом. Если в канале нет "свободных" буферов при вызове метода Get, мы создаём новый (ветка default). После того как мы воспользовались буфером, возвращаем его обратно в канал (метод Put). Если в канале "есть место", мы кладём буфер туда для переиспользования (метод Get вернёт нам этот буфер вместо создания нового). Иначе, мы переходим по ветке default и просто дропаем буфер.

Да, с буфером всё встало на свои места. Спасибо.

а не пробовали сразу парсить из потока и кодировать в поток?

err = json.NewDecoder(r.Body).Decode(&fooReq)

err = json.NewEncoder(w).Encode(fooRes)

не пробовал, но думаю, что стоит попробовать )

UFO just landed and posted this here

в foo_req.json 500 объектов. С рандомно сгенерированными строками str_a, str_b по 50 символов каждая.

В коде в шаге 1 вот эта строка лишння:
b, err := ioutil.ReadAll(r.Body)

Вариант реализации string2Byte с установкой Cap через Reflect можно подсмотреть в пакете fasthttp: ссылка, если вдруг кому-то стало интересно.

andrey_shalamov hashes на выходе будет содержать набор одинаковых строк или мне показалось?
for _, foo := range *fooReq {
        sha.Reset()
        sha.Write(stringToBytes(&foo.StrA))
        sha.Write(stringToBytes(&foo.StrB))
        base64.StdEncoding.Encode(buf.Bytes(), sha.Sum(sha256Buf[:0]))
        hashes = append(hashes, bytesToString(buf.Bytes()))
}

fail ) тот случай когда вредный совет оказался действительно вредным. bytesToString в нашем случае нельзя применить. Спасибо за замечание! Поправил статью.

Sign up to leave a comment.