@proGO

Страница 1600 из 1674
Gordon
30.07.2018
05:01:01
я вообще не знаю go, но в то же есть каналы. делаешь горутину, которая в бесконечном цикле просит файл, и когда файл не пустой через канал возвращает индекс. Не?

Pawel
30.07.2018
05:01:33
Подезреваю что ваша глобальная переменная должна быть инициализирована в init

А вообще глобальные переменные - это зло в чистом виде, без них надо.

Никита
30.07.2018
05:03:47
А вообще глобальные переменные - это зло в чистом виде, без них надо.
Не такое уж и зло, если они один раз получили значение и больше не меняются

Google
Pawel
30.07.2018
05:04:26
Это не переменные, а константы

Hello
30.07.2018
05:04:30
Спасибо за ответы, init не помог, ровно как и возвращение функции

Го не позволяет мне задать это как константу

Никита
30.07.2018
05:04:57
Это не переменные, а константы
Ну попробуйте создать константу не базового типа)

Я говорю именно о переменных

Например, создать глобальную перменную с *sql.DB

Pawel
30.07.2018
05:06:52
Ну попробуйте создать константу не базового типа)
Я создаю закрытое в пакете имя и открытую функцию, которая его значение возвращает. Это go way

Принципиально это от константы не отличается ни чем

Только синтпксически

Спасибо за ответы, init не помог, ровно как и возвращение функции
Не помог потому что вы не смогли внятно объяснить что вам собственно нужно

Hello
30.07.2018
05:13:53
Есть переменная, принимающая значение int от функции FindVersionIndex. Мне она нужна, чтобы не перепечатывать много раз один и тот же вызов FindVersionIndex внутри каждой функции пакета, так как значение предполагается быть одним и тем же.

Она запускается сразу, до получения данных, следовательно переменная принимает 0

А мне нужно, чтобы она запускалась только тогда, когда я её вызываю, например, как функцию

Google
Hello
30.07.2018
05:16:00
Разумеется, запускалсь после получения данных

Pawel
30.07.2018
05:16:06
Вот теперь понятно, ок

Вам не нужно хотеть "не перепечатывать много раз один и тот же вызов FindVersionIndex". В Го так не делают. Это распространённая ошибка новичков - применять в голанге привычные практики их других языков. Вы хотите ленивое значение, а не ленивую функцию. В голанге ничего подобного нет и не будет

Вам нужно либо инициализировать переменную в самом начале программы, либо каждый раз вызывать эту функцию

Как вариант сделайте отдельный пакет, поместите туда эту перменную, сделайте флаг инициализированности и отурытую функцию BaseIndexID, которая возвращает baseIndexID, приэтом если не установлен флаг, вычисляет baseIndexID и устанавливает флаг

Либо объявите тип, инкапсулирующий эту переменную, который работает аналогичным образом

https://play.golang.org/p/XBgm5srcsta

Hello
30.07.2018
05:39:55
Какая прекрасная идея! К сожалению, с этой идеей у меня точно уже будет оверинжиниринг. Пока останусь с "*перепечатывать много раз один и тот же вызов FindVersionIndex"

Maksim
30.07.2018
05:41:20
я б за такие прекрасные идеи руки отрывал) просто задача не с того конца решается)

Pawel
30.07.2018
05:41:45
да это вообще пофигу. всё зависит от функции этой вашей, которая перменную инициализирует

сколько она по времени выполняется?

Hello
30.07.2018
05:42:45
Сейчас замерю

Pawel
30.07.2018
05:43:05
Сейчас замерю
это время критично или нет?

ну или так func BaseIndexID() func () int { var ( baseIndexID int set bool ) return func () int { if !set { baseIndexID = FindVersionIndex() set = true fmt.Println("вычисляется") } else { fmt.Println("не вычисляется") } return baseIndexID } }

func main() { x := BaseIndexID() x() // вычисляется x() // не вычисляется }

Hello
30.07.2018
05:52:12
это время критично или нет?
Да, от него зависит время отдачи json клиенту



Pawel
30.07.2018
05:55:30
10 наносекунд для вас критично?!

Hello
30.07.2018
05:58:33
Неудобно получилось. О производительности речи не шло, всё от незнания некоторых вещей у меня

Google
Pawel
30.07.2018
05:58:53
го тур прошли?

Hello
30.07.2018
05:58:53
Стоит пересмотреть архитектуру

Угу

Maksim
30.07.2018
06:00:58
Pawel
30.07.2018
06:01:23
ясно, пиздабол значит

Maksim
30.07.2018
06:01:42
ну куда уж мне до великого повелителя микросервисов :)

Pawel
30.07.2018
06:02:28
Здесь не любят пиздаболв. Даже банят иной раз

Maksim
30.07.2018
06:03:06
не велика потеря, если честно) лучше банили быдлосов всяких

больше профит был бы :)

Pawel
30.07.2018
06:15:06
Больше профит был если бы те кто не может ответить за свои слова, засунули их себе в одно место плашмя прежде чем засорять эфир

Daniel
30.07.2018
06:15:10
Коллеги

Зобаню обоих

yuriy
30.07.2018
09:56:36
вопрос, на сколько быстрые анонимные структуры я хочу внутри апишек использовать Marshalы анонимных структур

сомневаюсь на счет быстродействия

Aleksei ?
30.07.2018
10:00:10
Зобаню обоих
Я бы за мат сразу бан, за выяснение отношений - после одного предупреждения. И правила в закреп повесить

Aleksei ?
30.07.2018
10:03:33
Ну выяснять отношения можно вежливо и тактично ?

Aleksey
30.07.2018
10:27:55
https://play.golang.org/p/0NqzydCM3eF Если горутина работает ограниченное время, окончание ее работы можно отследить через waitgroup, а если горутина в бесконечное цикле читает из канала и должна заверлиться после того, как завершиться последний писатель в канал, как быть? Как в моем примере правильнее отлавливать завершение такой горутины? Или вечный цикл для читателя не лучший способ прочитать все из канала?

Google
Aleksey
30.07.2018
10:34:23
Для выхода context
Range пробовал, но результат тот же, defer wg.Done() не отрабатывает, насчет контекста пойду доку курить

Vadim
30.07.2018
10:35:31
Daniel все правильно написал.

Ждешь пока все писатели закончат работу с помощью wg, когда все писатели закончили работу закрываешь канал и горутины автоматически выходит из цикла for range

Aleksey
30.07.2018
10:44:25
последний писатель должен закрыть за собой канал. обычно это делают дождавшись окончания всех писателей по waitgroup
Странно выглядит, но если по waitgroup отследить. завершение всех писателей, а потом запустить читателей, то работает все и отслеживается завершение читателей. Пошел читать подробнее по каналы, где то тут пробел в понимании имеется...

Daniel
30.07.2018
10:45:12
чет странное вы делаете

правильно так

Vadim
30.07.2018
10:46:50
https://play.golang.org/p/wQkgxrdgIFz

Daniel
30.07.2018
10:47:20
1. создать канал(ы) 2. запустить читателя(ей), (в форме range или с проверкой на закрытость канала) 3. запустить писателя(ей) с waitgroup 4. отследить окончание писателей по waitgroup 5. закрыть канал(ы)

Человек
30.07.2018
10:50:52
http://play.golang.org/p/l2a9B1_kIFf
Спасибо Вам огромное!!! В ноги должен я поклониться))

Aleksey
30.07.2018
10:51:48
1. создать канал(ы) 2. запустить читателя(ей), (в форме range или с проверкой на закрытость канала) 3. запустить писателя(ей) с waitgroup 4. отследить окончание писателей по waitgroup 5. закрыть канал(ы)
Если вначале запустить писателей и после закрытия канала запустить читателей, то можно отследить завершение каждого писателя и читателя по факту. За подсказку отдельное гран мерси

Vadim
30.07.2018
10:52:44
https://play.golang.org/p/wQkgxrdgIFz
Вот вам всё решение.

Прямо по инструкции

Vladimir
30.07.2018
10:53:48
Товарищи, подскажите, как мне выдернуть поле структуры у ошибки

type PathError struct { Op string Path string Err error } func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }

получаю PathError после вызова .LookPath

хочу именно PathError.Error поле получить, а не его Error() версию

Google
Vadim
30.07.2018
10:55:53
Некошерное имя для ошибки

Vladimir
30.07.2018
10:56:35
это пакет os/error

Vadim
30.07.2018
10:58:02
Тогда никак

Vladimir
30.07.2018
10:58:13
я так и подумал.

Aleksey
30.07.2018
10:59:59
Вот вам всё решение.
В моем случае это решение не совсем подходит, завершение читателей не отслеживается. Если же нужно просто дождаться завершения всех горутин, не проще ли использовать просто runtime.Gosched()?

Hello
30.07.2018
11:00:38
Вот вам всё решение.
https://play.golang.org/p/EZXN1YhdcGG Если важен порядок заполнения чисел, можно добавить Mutex

Aleksey
30.07.2018
11:05:10
а?!
Ключевой момент, ждешь завершения писателей, закрывает канал и только после этого ждешь завершения читателей. Ну и читаешь в range https://play.golang.org/p/BTStunGqcua И имеешь возможность отследить завершение любой горутины

Aleksey
30.07.2018
11:32:14
Проблему отслеживания завершения все писателей и читателей удалось решить вот так https://play.golang.org/p/BTStunGqcua Гран мерси за консультации и советы

Daniel
30.07.2018
11:33:47
done_all - это зачем?

select { case <-done: break default: in <- nums[i] i += 1 time.Sleep(1 * time.Microsecond) } что за мысль вы хотели выразить таким образом?!

Aleksey
30.07.2018
11:35:33
done_all - это зачем?
Это была идея внешнего управления горутиной, но недопилил, сорри

Страница 1600 из 1674