А ВОТ ТЕПЕРЬ ПАБЛИК
а какой логгер можете посоветовать?
Stanislav
log, logrus
dev_sheep
https://github.com/op/go-logging/blob/master/README.md
dev_sheep
Топ тема
Мерль
а какой логгер можете посоветовать?
В 75% имхо обычного log достаточно
А ВОТ ТЕПЕРЬ ПАБЛИК
В 75% имхо обычного log достаточно
Да я так и сделал 4 функции написал trace info error warn
Мерль
Было бы здорово иметь какой-нибудь Common Logging Interface
Stanislav
он какбы есть (log)
Stanislav
но его как-бы нет)
Ilya
В go-kit есть неплохой логгер
Aleksandr
А зачем другой? Я понимаю, что тот же logrus дает возможность ставить хуки, а в остальном почему обычный log не годен?\
Мерль
К тому же у него такое крутое название, я не могу не отметить это
Мерль
https://medium.com/@deckarep/paradigms-of-rust-for-the-go-developer-210f67cd6a29
Мерль
Great improvement to build/run #golang binaries in Windows containers + volumes got merged. https://github.com/golang/go/commit/53003621720ff39c4745a76f76847123c27b01ea
А ВОТ ТЕПЕРЬ ПАБЛИК
listen tcp 37.98.223.63:3010: bind: cannot assign requested address Что не так то?
Oleg
https://medium.com/@deckarep/paradigms-of-rust-for-the-go-developer-210f67cd6a29
Двойной агент - и там, и там запостил 😑
А ВОТ ТЕПЕРЬ ПАБЛИК
Запускаю локально указываю в ListenAndServer - 0.0.0.0:3010 коннектится клиент Запускаю на VPS нет Указываю ип впс, не запускается listen tcp 37.98.223.63:3010: bind: cannot assign requested address
kyprizel
посмотрите IP на впске, возможно у нее самой нет реального адреса
Oleg
Может быть, порт закрыт фаерволом?
Mikalai
Там нет интерфейса с таким адресом скорее всего
kyprizel
надо посмотреть ifconfig, если там 37.98.223.63 то смотреть файрвол, если нет - искать как натится/балансируется
А ВОТ ТЕПЕРЬ ПАБЛИК
Все ок, я просто сервер перепутал, извините, их два и ип идентичны практически
Anonymous
Фаервол не будет мешать забиндить порт.
Нельзя забиндить порт айпи несвоего компа
А ВОТ ТЕПЕРЬ ПАБЛИК
я не заметил разницы, спасибо всем
Mikalai
Нельзя забиндить порт айпи несвоего компа
О чем я собственно и писал выше
Anonymous
Аминь ))
kyprizel
подскажите пожалуйста - какие подводные камни есть с кросс-компиляцией при использовании cgo? один и тот же код - нормально компилится нативно, но при кросс-компиляции ругается на довольно безобидную конструкцию. Пример: На amd64 всё ok go get github.com/flynn/u2f/u2fhid При кросс-компиляции (arm-linux-gnueabihf-gcc есть) export CROSS_COMPILE=arm-linux-gnueabihf- export GOOS=linux export GOARCH=arm go get github.com/flynn/u2f/u2fhid gopath/src/github.com/flynn/u2f/u2fhid/hid.go:52: undefined: hid.Devices
kyprizel
пакадж github.com/flynn/hid собран - и для amd64 и для arm
kyprizel
пробовал golang 1.6 и 1.8
Ivahaev
Разве с cgo вообще работает кросскомпилляция?
Ivahaev
Go скомпилится под другую платформу, а C?
kyprizel
для этого мы задаем кросс-комилятор
Kirill
kyprizel
разобрался
kyprizel
в u2fhid файл назывался hid.go, при кросс-комиляции затирает пакадж hid, пофиксилось переименованием в u2fhid.go
kyprizel
🙈
не ожидаешь такого от разработчика :)))
dukeBarman
ога :)
Pavel
Можно задать очень глупый вопрос? Касается gogland
Anonymous
задавай
Pavel
Просто я стесняюсь. Когда код дебажится в gogland, то получается так, что пути до файлов "ломаются". Так как в коде явно указано, что файл лежит тут же, в папке с исполняемым файлом. Если бы дебаггер gogland мог компилировать файл не во временной папке своей, а в той, откуда берет запускаемый файл для компиляции, то этой проблемы бы не было. Единственное решение, которое я вижу - менять все ути на полные.
Pavel
файлы - ресурсы программы. конфиг файл, например.
Мерль
Всех с праздником! Немного хороших материалов: 1. [EN] Про преимущества []byte перед interface{} https://lanreadelowo.com/blog/2017/05/02/type-safety-or-convenience/ 2. [EN] Статья про создание современного веб-приложения на Go https://grisha.org/blog/2017/04/27/simplistic-go-web-app/ 3. [EN] Несколько полезных советов Go-разработчикам http://blog.stablekernel.com/go-quickstart-helpful-tips-for-experienced-programmers 4. [EN] Пример разработки приложения с каналами и горутинами https://www.thepolyglotdeveloper.com/2017/05/concurrent-golang-applications-goroutines-channels/ 5. [EN] Отладчик Delve обновился до v1.0.0-rc.1 https://groups.google.com/forum/#!topic/golang-nuts/kE-ZDrJEGR4
Мерль
Разработчик высокопроизводительного сервера распределённых блокировок Taooka делится тонкостями разработки API клиентской библиотеки на Go. http://taooka.com/blog/convenient-and-fast-api-on-golang/
Dmitriy / დიმიტრი
Привет. А может кто-то сказать что обозначает вот это объявление функции: func foo(data <- chan struct{}) {
Dmitriy / დიმიტრი
Это типа мы при вызове функции сразу получаем данные в data из канала переданного в функцию?
Oleg
Это значит, что функция получает канал data, из которого она может только получать данные
Oleg
А отправлять не может
Oleg
Пробел какой-то неидиоматичный
Oleg
func foo(data <-chan struct{}) {
Oleg
Вот
Dmitriy / დიმიტრი
Это значит, что функция получает канал data, из которого она может только получать данные
👍 спасибо Т.е. я могу задать ещё и канал в который функция может только писать? Отдельно конечно
Oleg
Ага :) func foo(data chan<- struct{})
Dmitriy / დიმიტრი
👍 сразу не заметил в чем разница, спасибо
Dmitriy / დიმიტრი
Насколько это плохо для программы запускать для чтения данных постоянно горутину и убивать её каждый раз после того как чтение завершится?
Quet
а почему это должно быть плохо?
Dmitriy / დიმიტრი
Мне кажется, что нет ничего хорошего в том что бы создавать горутину и убивать ее много-много раз. Но я в этом не уверен
Dmitriy / დიმიტრი
Может это фрагментирует память или ещё что
Quet
фантазии какие-то )
Dmitriy / დიმიტრი
Почему?
Quet
ничего страшного нет в таком
Anonymous
утра всем
Dmitriy / დიმიტრი
Мне кажется, что нет ничего хорошего в том что бы создавать горутину и убивать ее много-много раз. Но я в этом не уверен
В итоге получился вот такой вот монстр: https://github.com/shelomentsevd/mtproto/blob/master/mtproto.go#L299 спагетти какое-то
Mikhail
rows.Next()?
Mikhail
(не настоящий сварщик, просто предположил)
Anonymous
Всем привет! Подскажите, пожалуйста, как правильно распарсить такой yaml-файл: --- - test1: test1_k1: test1_val1 test1_k2: test1_val2 - test2: test2_k1: test2_val1 test2_k2: test2_val2Как правильно описать структуру?
Aleksandr
type A struct { B B C C }
ros
type AutoGenerated []struct { Test1 struct { Test1K1 string `yaml:"test1_k1"` Test1K2 string `yaml:"test1_k2"` } `yaml:"test1,omitempty"` Test2 struct { Test2K1 string `yaml:"test2_k1"` Test2K2 string `yaml:"test2_k2"` } `yaml:"test2,omitempty"` }
Anonymous
Может не совсем точно описал задачу. Если заранее не известны значения test1 и test2? Известна только их структура. Т.е. например в другой раз придет такой yaml: --- - test3: k1: val1 k2: val2 - test4: k1: val1 k2: val2
Aleksandr
как можно описать структуру если ее нет?
Anonymous
Ясно, спасибо! Пошел писать свой Unmarshal )))
Aleksandr
Ясно, спасибо! Пошел писать свой Unmarshal )))
func (user *User) UnmarshalJSON(data []byte) error { var raw map[string]interface{} json.Unmarshal(data, &raw) user.Email = raw["email"].(string) user.Nickname = raw["nickname"].(string) user.Hash = raw["hash"].(string) rawData := raw["data"].(map[string]interface{}) if myLeagues, ok := rawData["myLeagues"]; ok { for _, myLeaguesMap := range myLeagues.(map[string]interface{}) { for key, _ := range myLeaguesMap.(map[string]interface{}) { if key != "used" { keyParts := strings.Split(key, "_") sportId, _ := strconv.Atoi(keyParts[0]) countryId, _ := strconv.Atoi(keyParts[1]) user.Leagues = append(user.Leagues, &League{ Id: keyParts[2], SportId: sportId, CountryId: countryId, }) } } } } if myGames, ok := rawData["mygames"]; ok { for _, myGamesMap := range myGames.(map[string]interface{}) { for key, _ := range myGamesMap.(map[string]interface{}) { if key != "used" { user.GamesIds = append(user.GamesIds, key) } } } } return nil } типа такого
Aleksandr
ой, большой экран