heavycharged
а сейчас вы решили указать node *Node
Nikita
у меня в прошлой функции написано тоже написано node
Nikita
а, все, рекомендация пропала
Nikita
значит я исправил
heavycharged
Канал — это и есть очередь, и их так и надо использовать
канал это не очередь, и их так не надо использовать
Artem
канал это не очередь, и их так не надо использовать
вообще буферизированные каналы в го это не что иное, как thread-safe FIFO queue
heavycharged
ну, вернее так, канал обладает свойствами очереди (FIFO), и его можно использовать как thread-safe очередь, но только в том случае, если нужно раздавать данные воркерам.
heavycharged
если нужна именно очередь а не какой-то fan-in/fan-out, тогда лучше в слайс делать.
heavycharged
тут вопрос в том, что иногда у новичков может быть соблазн юзать канал с буфером как очередь, потому что думают, что удобно, не нужно мучиться с проверкой длины слайса, усекать слайс, писать свой queue тип с нужными методами и т.д.
Mikhail
есть какой то вариант реализации поиска подстроки в строке? Как например в питоне: "some" in "string"
Artem
Можно ли получить строку из файла без цикла?
Artem
Ну я знаю номер, мне нужно значение
Sergei
не распарсил
Дмитрий
Можно ли получить строку из файла без цикла?
прочти весь файл, разбей на строки, возьми по индексу
Дмитрий
эффективнее циклом будет конечно
Artem
Как эффективно получить рандомную строку из файла?
Artem
за 1 цикл
Artem
а то я пока за 2 только смог
Artem
Там не более 2000 строк
Дмитрий
гиговый файл прочесть?)
я так понял, задача — не использовать циклы. а с таким критерием уже пофиг)
Artem
Задача сделать это за 1 цикл
Artem
Вопрос как?)
Дмитрий
Задача сделать это за 1 цикл
кинь код, где у тебя 2 цикла
Aleksandr
bufio.Scanner
Scanner provides a convenient interface for reading data such as a file of newline-delimited lines of text
Artem
Дмитрий
так тебе надо получить строку по номеру или рандомную строку из всех? это две разных задачи
Artem
Рандомную строку из файла
Aleksandr
ну с такой постановкой задачи, не зная кол-во строк, конечно никак
Artem
Сейчас это сделано так: считаем кол-во строк, делаем рандом, потом ищем по номеру строки
Дмитрий
Рандомную строку из файла
в таком случае сделай как я написал выше — прочитай весь файл, разбей в массив строк и выбери рандомный индекс
Artem
А как можно курсор на начало поставить, чтобы повторно не открывать файл?
Artem
Как сделать массив, не знаю количества?
Artem
Зная количество я делаю так make([]string, count)
Artem
а если количество неизвестно?
Wingman
make([]string, 0)
heavycharged
это не массив вы делаете, если что
Дмитрий
Как сделать массив, не знаю количества?
content, err := ioutil.ReadFile(filename) if err != nil { // Do something } lines := strings.Split(string(content), "\n")
Artem
ну слайсы делаю
Artem
Ну вообще вроде make делает массив и возвращает срез, который ссылается на этот массив
heavycharged
content, err := ioutil.ReadFile(filename) if err != nil { // Do something } lines := strings.Split(string(content), "\n")
можно bytes.Split(), потому что ReadFile файл у нас []byte вовзращает, а потом, когда выбрали рандом, уже конвертить в строку, но тут вопрос в количестве строк. если их будет много, можно упасть по памяти.
Anton
запиши данные в файл так, чтоб каждая строка занимала один блок (размерность сам выбери, в зависимости от данных) читай с офсетом равным размер блока * кол-во общее кол-во блоков - это размер файла
Artem
file.Seek(...) перейти на начало
А что за второй параметр?
Aleksandr
Дмитрий
heavycharged
почему?
потому что по памяти вылетишь, если файл большой
Aleksandr
почему?
я выше спросил: гиговый файл?
Wingman
ого, втягиваешься?)
Дмитрий
я выше спросил: гиговый файл?
дак ответили, что небольшой
Дмитрий
я выше спросил: гиговый файл?
а потому эффективнее будет считать все, а не пробегать по файлу два раза
Aleksandr
дак ответили, что небольшой
а эффективность от этого не изменилась.
Wingman
похоже, только циклами
heavycharged
вообще, можно сделать как-то так: прочитать весь файл и найти все индексы с "\n", забить в []int после этого, выбираем рандомный элемент из этого слайса, а элемент -1 - это конец прошлой строки. так можно прыгать по файлу в рандомные места. но это чтобы в памяти все не хранить.
Quet
для файла в 2000 строк наверное не имеет смысла что-то выдумывать
heavycharged
это чтобы не мудохаться с константным оффсетом для всех строк
Quet
ioutil.ReadAll, strings.Split и вот это все
Anton
это чтобы не мудохаться с константным оффсетом для всех строк
кстати да, вариант с сохранением \n хорош. не додумал 😔
Aleksandr
ioutil.ReadAll, strings.Split и вот это все
еще раз: для гигового файла?
Дмитрий
2000 строк - это не размер файла, а кол-во строк
окей, по памяти эффективнее читать два раза, согласен. но по скорости явно быстрее считать все, т.к. обращение к файловой системе
Quet
2000 строк но файл размером в гиг?
Oleh
еще раз: для гигового файла?
та забей уже, сказал он что нет, и его все устраивает
Aleksandr
та забей уже, сказал он что нет, и его все устраивает
не видел такого. тем не менее можно накидать вариантов лучше и его это тоже устроит
Artem
2000 строк но файл размером в гиг?
По названию переменных не понятно, что там прокси лежат?)
Дмитрий
нет же.
нет — не быстрее?
Дмитрий
почему?
Oleh
есть разница за сколько времени прочитать конфиг з прокси?)
Aleksandr
2000 строк но файл размером в гиг?
а почему нет? гиг - это абстрактно. 10 мег, 100 мег, неважно. строка не имеет ограничения по размеру
Дмитрий
есть разница за сколько времени прочитать конфиг з прокси?)
а есть разница по памяти для небольшого файла?
Quet
а почему нет? гиг - это абстрактно. 10 мег, 100 мег, неважно. строка не имеет ограничения по размеру
да я про реальный мир когда последний раз у вас был текстовый файл со строками по 500кб каждая?