Мерль
Выпуск 081. Интриги и расследования. http://golangshow.com/cdn/episodes/081.mp3. Sent from Podcast Republic.
Alexey
Задеплоино прямо с HighLoad++
Constantine️
как тебе HL?
mixa
всем доброй ночи, подскажите кто пользовался gorilla/context ? для чего его можно юзать? можно вот так использовать?: package main import ( "log" "net/http" "time" "github.com/gorilla/context" "github.com/gorilla/mux" ) func main() { r := mux.NewRouter() r.PathPrefix("/public/").Handler(http.StripPrefix("/public/", http.FileServer(http.Dir("./public")))) r.HandleFunc("/", LogReq(http_main)) srv := &http.Server{ Handler: r, Addr: "127.0.0.1:80", WriteTimeout: 400 * time.Second, ReadTimeout: 400 * time.Second, } LogPrint("start listening port: 80") srv.ListenAndServe() } func http_main(w http.ResponseWriter, r *http.Request) { w.Write([]byte("привет ворлд")) } //функция для лога всех запросов func LogReq(f func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { context.Set(r, "startLoadTime", time.Now()) log.Print("<- " + r.URL.Scheme + " " + r.URL.Path) f(w, r) startLoadTime := context.Get(r, "startLoadTime").(time.Time) log.Printf("-> "+r.URL.Scheme+" "+r.URL.Path+" %v ", time.Now().Sub(startLoadTime)) context.Clear(r) } }
mixa
блин каша получилась
Valery
Используй go playground или pastebin
mixa
вот основные моменты: r.HandleFunc("/", LogReq(http_main)) //функция для лога всех запросов func LogReq(f func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { context.Set(r, "startLoadTime", time.Now()) log.Print("<- " + r.URL.Scheme + " " + r.URL.Path) f(w, r) startLoadTime := context.Get(r, "startLoadTime").(time.Time) log.Printf("-> "+r.URL.Scheme+" "+r.URL.Path+" %v ", time.Now().Sub(startLoadTime)) context.Clear(r) } }
mixa
ага, щас попробую
mixa
http://pastebin.ru/vumZrwP2
Valery
Ух, это не совсем тот пастебин, который ожидался
mixa
https://play.golang.org/p/zvlYD0OkHE
mixa
просто с контекстом немного не понимаю какой в нем смысл
mixa
он модифицирует http.Request и позволяет нам хранить там любые наши данные во время обработки http запроса
mixa
но какой в нем смысл если мы не можем передать обработку этого запроса другой функции
mixa
о до меня дошло )
mixa
спасибо )
Valery
всегда пожалуйста, обращайтесь
mixa
что то типа для такого https://play.golang.org/p/fmY7RX5Tn_
mixa
верно?
mixa
просто внутренний голос сейчас подсказывает что я жутко велосипедничаю
Valery
По всей видимости мы, к сожалению, вдвоем здесь сейчас, а я ничем помочь не могу
Valery
мимопроходил
mixa
ага, спс и на том, пойду гуглить
Roman
привет Артурчик)
MF
Друзья гоферы, есть вопрос Если при перечислении констант, используется iota типа антайпд инт, и все последующие константны в блоке буду принимать значение инкремента, экономит ли это память либо влияет на производительность В чем собственно профит от использования данной фичи?
MF
Лично мне сама конструкция симпатична, но хотелось бы услышать мнение экспертов по этому поводу Так как не всегда такое оглашение является более "читабельным" для людей которые ковыряются в коде
ros
iota - это синтаксический сахар
MF
Значит профита никакого, просто приятная конструкция которая радует глаз вновь прибывших в ряды голанга?
ros
так точно
MF
Большое спасибо за оперативный ответ!)
Aleksey
Всем привет, можете подсказать, что можно использовать для создания rest api сервера на go?
Nikita
Есть разные библиотеки, маленькие и большие монстры
Nikita
Тут где то была ссылка на библиотеки на go
Nikita
С телефона искать не удобно, а то скинул бы
Nikita
https://go.libhunt.com можно тут посмотреть
Роман
В прикреплённом сообщении в этом чате же :)
Мерль
50 оттенков Go: ловушки, подводные камни и распространённые ошибки новичков / Хабрахабр https://m.habrahabr.ru/company/mailru/blog/314804/
Yehor
Спасибо за ссылку, вчера вроде постили сюда её на английском
Мерль
В комментариях неслабо так набросили
Slava
Хм, а по делу ли набросили?
Мерль
Ещё существенный минус Go в том, что в стандартных библиотеках нет самых элементарных вещей, которые есть в изобилии в других языках и к которым все привыкли, поэтому Go толкает разработчика на создание велосипедов в диком количестве, как результат снижение продуктивности и увеличение возможных ошибок в коде. Н-р: нет функции типа IsFileExists () (ну серьезно нет) «Чего только нет стандартной библиотеке Go, практически ничего нет» Стандартными средствами для работы с SQL невозможно получить данные запроса полный состав которых и тип которых вам заранее неизвестен. Обработка элементарного запроса «select * from table» превратится для вас в ад по поиску костыля. Определение видимости элемента в зависимости от кейса первой буквы отдельный гемор, что будет если вы решите поменять область видимости? Да, да… Возвращаемых функцией кортежи нельзя на лету преобразовать тип. func get() (int64, err) {} i int err error i, err = get() // Ошибка, которую нельзя исправить в этой строке А ещё нет директив компилятора (Ну и так далее) Вообще, взглянув на те решения которые предлагает Go в тех или иных ситуациях (Синтаксис и прочее) Создается впечатление, что автор языка школьник который решил изобрести свой язык. Как ещё можно объяснить такое решение для условной компиляции под разные платформы: pkg_windows.go pkg_linux.go и многие, многие другие решения. Серьезно, строить современный язык, стоя на плечах гигантов и имея весь их опыт и сделать такое? Ну блин( пс За статью спасибо
hamper 𓅝
IsFileExists в nodejs последнем ее в deprecated перевели потому что очень многие пользуются ей неправильно, так что ненужная функция
Andrey
Ещё существенный минус Go в том, что в стандартных библиотеках нет самых элементарных вещей, которые есть в изобилии в других языках и к которым все привыкли, поэтому Go толкает разработчика на создание велосипедов в диком количестве, как результат снижение продуктивности и увеличение возможных ошибок в коде. Н-р: нет функции типа IsFileExists () (ну серьезно нет) «Чего только нет стандартной библиотеке Go, практически ничего нет» Стандартными средствами для работы с SQL невозможно получить данные запроса полный состав которых и тип которых вам заранее неизвестен. Обработка элементарного запроса «select * from table» превратится для вас в ад по поиску костыля. Определение видимости элемента в зависимости от кейса первой буквы отдельный гемор, что будет если вы решите поменять область видимости? Да, да… Возвращаемых функцией кортежи нельзя на лету преобразовать тип. func get() (int64, err) {} i int err error i, err = get() // Ошибка, которую нельзя исправить в этой строке А ещё нет директив компилятора (Ну и так далее) Вообще, взглянув на те решения которые предлагает Go в тех или иных ситуациях (Синтаксис и прочее) Создается впечатление, что автор языка школьник который решил изобрести свой язык. Как ещё можно объяснить такое решение для условной компиляции под разные платформы: pkg_windows.go pkg_linux.go и многие, многие другие решения. Серьезно, строить современный язык, стоя на плечах гигантов и имея весь их опыт и сделать такое? Ну блин( пс За статью спасибо
os.IsNotExist Директивы компилятора немного зло
Valery
"Как ещё можно объяснить такое решение для условной компиляции под разные платформы" А как должно быть?
Andrey
И чем решение плохо? Кажется вполне адекватным
Andrey
У меня пакеты, в которых различался код немного под ось работали одинаково на винде, линуксе и маке
Slava
подскажите плиз, а что с `select * from table`не так? просто давно не пользую sql, и не совсем понял что автор комментария имел ввиду
Yehor
offtopic: посоветуйте чат об облачных технологиях для новичков
Andrey
По поводу select * from table https://gist.github.com/anonymous/c9bbed6212b60f168529fb7e3cdbf33a По-меому довольно тривиально: если действительно не знаешь, какие данные должны прийти, лол Хотя в 21 веке с орм да и без, тип данных так-то должен быть хоть как-то описан в модели, ну ладно
Andrey
Упс, я забыл дописать кое-что rows, err := db.Query("SELECT * FROM userinfo")
Andrey
К тому же, можно прикрутить type switch
Nikita
https://twitter.com/bketelsen/status/796604147835555840
Daniil
Кстати не поверите, в stl плюсовом такой функции тоже нету.
John
Кстати не поверите, в stl плюсовом такой функции тоже нету.
Это ж плюсы, чего ты хотел. В русте вот есть такая функция в std
Daniil
Это ж плюсы, чего ты хотел. В русте вот есть такая функция в std
ну хз. В плюсах сейчас и треды есть в стандартной либе, а такой, казалось бы, обязательной функции и нету :(
Daniel
а вот зачем она нужна?
Судзумия
В русте нет рекурсивного копирования в стд
Daniil
а вот зачем она нужна?
Ты серьезно? Ну вот хочу я файл создать и разумнее первое что сделать проверить не существует ли он. Можно конечно получить список всего что есть в директории и искать там, но блин...
Daniel
можно создание файла с правильными фоагами вызвать
Andrey
можно создание файла с правильными фоагами вызвать
А если тебе не нужно создавать, а тебе нужно просто проверить isFileInDir
Vladimir
Нахрена оно надо если есть os.Open ?
Vladimir
ну и на самом деле есть os.IsExist если шо
Andrey
Народ, можно как-то сделать, что бы в json не маршалились нулевые значения? например есть структура {Name string, Suname string } и надо что бы если есть только Name то только оно было в jsone?
Andrey
анотация json:"-" это не то
Andrey
он тогда совсем не маршалит
Andrey
а надо что бы маршалил если есть значение и не маршалил если его нету
Andrey
ага выглядит буд-то то что надо :)
Oleg
А, это в другую сторону работает
Oleg
Это для Unmarshal
Oleg
Тогда нужно использовать поинтеры на значения
Daniel
в обе оно работает
Daniel
в обе
hamper 𓅝
Ты серьезно? Ну вот хочу я файл создать и разумнее первое что сделать проверить не существует ли он. Можно конечно получить список всего что есть в директории и искать там, но блин...
ты проверил что файла нет, в это время его кто то создал и ты попытался в него спокойно писать, поэтому лучше именно сразу ошибку проверять при попытке создания, собственно в документации nodejs неплохо написано чем плох такой подход https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_exists_path_callback