Dmitry
да
Dmitry
имхо, но каналы в этом случаи предпочтительней, будет функция которая собирает данные и кладёт в канал. и вторая функция, которая будет читать из канала всё что придёт и как то с этим жить
Daniel
если только "как с этим жить" не придется распараллеливать
Daniel
но именно обновление слайса можно делать или одной горутиной, слушающей канал, или закрыть обновление слайса мьютексом (рид-райт-мутексом, возможно)
Daniel
А каналы скорость работы просаживать не будут? Или в любом случае придется пожертвовать временем?
а вы померяйте. какналы, действительно, медленные, по сравнению с мутексами. но, скорее всего, вы это даже померять не сможете
Daniel
скорее всего так оно и есть. я не так давно с го балуюсь, мне ещё пилить и пилить
я давно с go балуюсь, но тоже ни один тест мне на реальных данных разницу между каналами и мутексами не показал. кроме одного случая, когда в слайс писала сотня горутин, а читали миллионы
Anonymous
Anonymous
Парни, после go build получаю такую ошибку > app\models\user.go:18: invalid recursive type User Юзаю gorm, собсна https://play.golang.org/p/0agwqBt3i8 Гугл не помог, чаво не так?
Aleksandr
видимо ругается на User в 30 строке
Aleksandr
и на 40
Anonymous
Хм, а как можно починить? Там связь через user_id(UserID) должна быть
Aleksandr
про гугл ты врешь - https://www.google.ru/search?client=ubuntu&channel=fs&q=gorm+recursive+type&ie=utf-8&oe=utf-8&gfe_rd=cr&ei=f4-NWeu_OsqEygXNt5X4BA
Anonymous
Забанили меня там просто :с Спасибо :)
Anonymous
Ох уж эти указатели, спасли. Спасибо еще раз
Anonymous
Подскажите такой момент, набросал пример сбора файлов из 2-х дир, так то их может быть больше но не суть. Вот что получилось: import ( "fmt" "os" "path/filepath" "strings" "sync" ) func main() { var slicePath []string var wg sync.WaitGroup var c chan string = make(chan string) go collectionPath(&slicePath, c) wg.Add(2) go walkDir(C:\TEST_PATH\001, c, &wg) go walkDir(C:\TEST_PATH\002, c, &wg) wg.Wait() fmt.Println(len(slicePath) - 2) for _, path := range slicePath { fmt.Println(path) } } func collectionPath(slicePath *[]string, c chan string) { for { path := <-c *slicePath = append(*slicePath, path) } } func walkDir(path string, c chan string, wg *sync.WaitGroup) { filepath.Walk(path, func(wPath string, info os.FileInfo, err error) error { c <- strings.Replace(wPath, "\\", "/", -1) return nil }) wg.Done() } Но если я буду делать что-то дальше, у меня будет болтаться в воздухе одна горутина которая в цикле ждет данных. Как её можно прибить? Отправить какое-то значение и выполнить break? Или есть более изящный способ?
Anonymous
if path == godead { break } else { *slicePath = append(*slicePath, path) } Велосипед прям
Dmitry
Подскажите такой момент, набросал пример сбора файлов из 2-х дир, так то их может быть больше но не суть. Вот что получилось: import ( "fmt" "os" "path/filepath" "strings" "sync" ) func main() { var slicePath []string var wg sync.WaitGroup var c chan string = make(chan string) go collectionPath(&slicePath, c) wg.Add(2) go walkDir(C:\TEST_PATH\001, c, &wg) go walkDir(C:\TEST_PATH\002, c, &wg) wg.Wait() fmt.Println(len(slicePath) - 2) for _, path := range slicePath { fmt.Println(path) } } func collectionPath(slicePath *[]string, c chan string) { for { path := <-c *slicePath = append(*slicePath, path) } } func walkDir(path string, c chan string, wg *sync.WaitGroup) { filepath.Walk(path, func(wPath string, info os.FileInfo, err error) error { c <- strings.Replace(wPath, "\\", "/", -1) return nil }) wg.Done() } Но если я буду делать что-то дальше, у меня будет болтаться в воздухе одна горутина которая в цикле ждет данных. Как её можно прибить? Отправить какое-то значение и выполнить break? Или есть более изящный способ?
for path := range c {} В основной функции после Wait: close(c) и желательно дождаться окончания горутины с collectionPath через еще один waitGroup или просто через закрытие еще одного канала
Dmitry
Тяжело понять, но попытаюсь. Спасибо.
что-то типа такого: https://play.golang.org/p/-UwK0T1Sj9
Anonymous
что-то типа такого: https://play.golang.org/p/-UwK0T1Sj9
А как тут действует <-endCh я просто понять не могу. Или этим действием мы добиваемся выхода из цикла в функции collectionPath?
Dmitry
здесь мы блочимся пока collectionPath на выходе не закроет этот канал
Dmitry
тем самым дожидаемся что в slicePath больше ничего не будет добавляться и можно его печатать
Anonymous
Хех, забавно: https://play.golang.org/p/KjgKn2UrxC
Daniel
ну - какой-то контейнер, да
Dmitriy / დიმიტრი
Какие хорошие библиотеки есть для патча json'a? Было бы классно, если туда можно было передать список полей, которые НЕ надо менять и функция возвращала бы ошибку, если эти поля собираются поменять.
Мерль
[last news] Generate Enums for Go from Doc Comments
Илья
выглядит очень неплохо :)
Мерль
openebs/openebs: OpenEBS is containerized block storage written in Go for cloud native and other environments w/ per container (or pod) QoS SLAs, tiering and replica policies across AZs and environments, and predictable and scalable performance. https://github.com/openebs/openebs
who
ребят, не подскажите. REST клиент из браузера отправляет и все ок.а этот кусок кода всегда получает 404.в чем может быть проблема?урл один и тот же.заголовки тоже
Daniel
так не бывает
Daniel
разница есть, или в uri, или в хосте, или в параметра
Daniel
а, еще метод может быть не тот
Anonymous
что скорее всего
Anonymous
если апи организовано верно, то скорее всего неверный урл
Anonymous
неверные заголовки доступа должны были дать 403
who
спасибо. буду искать дальше
Daniel
если у вас там без шифрования - нимите трафик tcpdump-ом, да посмотрите, в чем там разница
Anonymous
а body nil - это так и надо?
who
да. в теле ничего нет
Anonymous
вот хотя бы IDE видно нормальное ) плюшка от goglang c названиями аргументов тема.
Anonymous
Мужики, кто какой библиотекой пользуется для полнотекстного поиска?
Daniel
Библиотекой?
Daniel
Регекспов недостаточно?
Anonymous
к сожалению недостаточно, нужно сделать что-то типо живого поиска.
Anonymous
пробовал bleve, то ли я его не понимаю, как работает. толи лыжи не едут )
Anonymous
это же фича бд
Anonymous
sphinx самый норм
Daniel
Тогда не о библиотеке речь, а о продукте комплексном
Daniel
Токенизатор, обратный индекс, вот это вот все
Anonymous
ага,спасибо за новодку.
engelbart
>should not use basic type string as key in context.WithValue (golint) почему?
Vasily
Чтобы случайно не было конфликтов, когда в другом месте проставится ключ с таким же значением, но другими данными
Vasily
Да, я
Oleksii
Да, я
Спасибо за хорошие уроки :)
Vasily
Пожалуйста ) Мы старались
Kirill
а что я там могу узнать?
Anatoly
а что я там могу узнать?
Какой надо записать чтобы тебя поблагодарили в чяте за урок
Axm
скажите, плиз, есть ли более элегантный способ сделать вот это? код выглядит ужасно.
Daniel
а что делает этот код?
Axm
внутри себя некоторые вещи в итоге return http.ListenAndServe(:port, blabla)
engelbart
Народ. а нет ли у нас какой нить кросс-компиляции под древние машины? /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found
Anonymous
я думаю можно в инете docker images найти
engelbart
Да нет там докреа на той машине
Aleksandr
Да нет там докреа на той машине
есть понимание, что из коробки работать не будет, и все равно придется что-то качать и ставить?
Aleksandr
как минимум старый glibc
Aleksandr
хотя докер идеальный вариант для этого