
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
Принципиально это от константы не отличается ни чем
Только синтпксически

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

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
Стоит пересмотреть архитектуру
Угу

Pawel
30.07.2018
05:59:12

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
Зобаню обоих
Я бы за мат сразу бан, за выяснение отношений - после одного предупреждения.
И правила в закреп повесить

Savely
30.07.2018
10:01:21

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

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

Google

Vadim
30.07.2018
10:31:59
Для выхода context

Daniel
30.07.2018
10:33:09

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

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

Aleksey
30.07.2018
10:51:48

Vadim
30.07.2018
10:52:44
Прямо по инструкции

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()?

Daniel
30.07.2018
11:00:07

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
И имеешь возможность отследить завершение любой горутины

Vadim
30.07.2018
11:24:26

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