Daniel
Andrei 🦉
вернее даже так https://play.golang.org/p/pgxVLBwvJKr
Daniel
я вот боюсь постить примеры кода до того, как человек объяснит, что же он сделать пытается
Alexander
Но проще через range. А в main просто канал закрыть
Anonymous
тут дело не в выводе, я хочу чтобы гоурутина слушала команды через поток, и уже при изменении значения в канале что-то делала, я смотрел инфинити луп на стак оверфлоу, но почему-то у меня так не работает
Andrei 🦉
Andrei 🦉
и main дождется завершения работы горутины с помощью wg.Wait
Anonymous
а почему извлечение значения происходит через range? зачем итерировать по объекту если он хранит 1 значение? не могу въхать
Andrei 🦉
Andrei 🦉
желательно этот тур пройти весь
Anonymous
я в процссе, просто вопрос возник заранее, спасибо
Oleksandr
ребята, подскажите - как в go решается такая задача
есть http-api, к нему нужно делать запросы
при этом на один end-point может отсылаться несколько запросов - сработать должен только первый
в том числе в ситуации когда второй запрос поступил до того как пришёл ответ на первый
все последующие запросы должны получить данные, также как и первый
на JS это бы выглядело как-то так
var Cache = {}
function MakeRequest(name){
if (!Cache[name]){
const url = `https://api.github.com/users/${name}`
Cache[name] = fetch(url)
}
return Cache[name];
}
var r1 = MakeRequest('john');
var r2 = MakeRequest('smith');
var r3 = MakeRequest('john'); //магия
r1.then(x=>console.log(x))
r2.then(x=>console.log(x))
r3.then(x=>console.log(x))
на Go у меня получился такой код, но у меня нет уверенности ни в его оптимальности, ни в правильности работы
https://play.golang.org/p/tIbtX137vFo
Eugeny
Nikita
ребята, подскажите - как в go решается такая задача
есть http-api, к нему нужно делать запросы
при этом на один end-point может отсылаться несколько запросов - сработать должен только первый
в том числе в ситуации когда второй запрос поступил до того как пришёл ответ на первый
все последующие запросы должны получить данные, также как и первый
на JS это бы выглядело как-то так
var Cache = {}
function MakeRequest(name){
if (!Cache[name]){
const url = `https://api.github.com/users/${name}`
Cache[name] = fetch(url)
}
return Cache[name];
}
var r1 = MakeRequest('john');
var r2 = MakeRequest('smith');
var r3 = MakeRequest('john'); //магия
r1.then(x=>console.log(x))
r2.then(x=>console.log(x))
r3.then(x=>console.log(x))
на Go у меня получился такой код, но у меня нет уверенности ни в его оптимальности, ни в правильности работы
https://play.golang.org/p/tIbtX137vFo
Ну во-первых, (*r) можно просто заменить на r, т.к. в го автоматическое разыменовывание, во-вторых, хендлеры исполняются в отдельных горутинах, потому код потоконебезопасен
Oleksandr
ага, разименовывание убрал
а что называете хендлерами? - у меня же http-клиент, а не сервер
и в чём может проявится потоконебезопасность если не используется общая память?
Andrei 🦉
Oleksandr
ага, понял - логично
Kirya
Eugeny
Oleksandr
Есть sync.Once, если я правильно понял задачу
как я понял once.Do просто выполняет переданную функцию лишь раз
при этом нет ни возможности передать в функцию параметры, ни получить возвращаемое значение
в моём же случае нужен возврат, необходимость повторного вызова зависит от переданных параметров, и главное - то что функция асинхронна
Andrei 🦉
Oleksandr
гонка, я так понимаю это race, т.е. последовательное вполнение асинхронных вопросов?
с локом на мапу не очень понимаю; по идее можно использовать sync.Map - который concurrency-safe?
Denis
Илья
Илья
тут как раз про то, когда что использовать
Eugene
Ребята, есть возможность как то определить, что пришел ajax-запрос ? Не приходит заголовок: X-Requested-With по которому можно определить. Отправляю из браузера, тип XHR
Oleksandr
а в devtools браузера тоже нет этого хедера?
Eugene
нет
Oleksandr
на вкладку XHR ещё попадают запросы сделанные через fetch()
на бекенде мы их никак не можем определить, но можно добавить к ним кастомный заголовок
лучше, чтоб он был по смыслу - вроде "Accept": "application/json"
Eugene
отправка была через jquery
Eugene
нет: дело в том, что хочется знать что приходит с фронта. и каким способом, что бы отдавать данные. "Accept": "application/json" тут не катит. этот заголовок можно применять и без XHR
Eugene
нашел выход только в императивном указании на js: ` beforeSend: function(xhr){xhr.setRequestHeader('X-Requested-With', 'xmlhttprequest');},
`
Eugene
больше никак
Oleksandr
может в настройках запроса crossDomain стоит в true?
Kirya
или query параметр добавляй ajax=true
Eugene
crossDomain = false да и стоит CORS
Eugene
ajax=true на каждый запрос не надобавляешься
Eugene
да и костыль это
Oleksandr
так запрос на тот же домен или кроссдоменный?
Eugene
на поддомен
Oleksandr
тогда получается он как кроссдоменный
Eugene
на поддомен разрешены только с нескольких хостов
Oleksandr
вот что по этому поводу написано в исходниках jQuery
// X-Requested-With header
// For cross-domain requests, seeing as conditions for a preflight are
// akin to a jigsaw puzzle, we simply never set it to be sure.
// (it can always be set on a per-request basis or even using ajaxSetup)
// For same-domain requests, won't change header if already provided.
так что - авторы советуют юзать .ajaxSetup() - по сути тот же beforeSend
Eugene
ajaxSetup - согласен
Eugene
другой вопрос, как обходится без jquery. Напрмер, часто работаю с VueJS. там своя либа. и там тоже надо насраивать заголовки
Oleksandr
понятно что всё равно всё идёт к тому что все будут использовать fetch() - осталось чтоб ie11 додох
ну а вокруг fetch(), да в принципе и любой библиотечкой функции wrapper написать несложно
Eugene
не. у нас проекты такие: обязательная поддержка FF48 - а это вообще беда
Eugene
Кстати, crossDomain = true - не помог. а beforeSend = работает как надо. Всем спасибо
Oleksandr
ты не понял - crossDomain как раз таки false должен быть - для кроссдоменных запросов не ставится этот заголовок
например
$.ajaxSetup({crossDomain:false});
$.get('https://api.github.com/users/john')
но.. стоит нам изменить https на http и получим “preflight is invalid redirect error, о которой и предупреждают авторы jQuery
так что лучше уже хедер указать
Eugene
так он по умолчанию false и был
invariance
а это точно чат по голангу :D
Kirill
что тут за вакханалия
Kirill
какой jq? вы решили вернуться на 10 лет в развитии?
Vasily
это называется ретро
типа как пиксель-графика в современных играх
Kirill
это называется разве что созвучно. пиксель-графика хотя бы приятной бывает, а jquery - никогда и не был приятным, а лишь необходимостью
Wingman
Помогите пожалуйста :)
https://play.golang.org/p/0tn_2qYZgPf
вкратце:
запускаю горутину, передаю в неё каналы, передаю из неё данные по каналам, извне закрываю каналы
алгоритм таков, что внизу, после завершения for i:=.......,
a) закрывается канал stopListen
б) в горутине запускается кейс <-stopListen
в) горутина передаёт данные в канал pingResult
г) основной код получает результат из pingResult, и только потом закрывает его
НО - у меня, блин, код паникует на строке pingResult <- j.Result(probes) — хотя, по идее, ну никак не может в этом месте канал оказаться закрытым =\
Anonymous
Всем привет, а есть у кого то пример как преопределить функцию сортировки аргументов из пкета flag
https://stackoverflow.com/questions/36326038/golang-how-to-disable-automatically-flag-sorting
?
Andrei 🦉
Помогите пожалуйста :)
https://play.golang.org/p/0tn_2qYZgPf
вкратце:
запускаю горутину, передаю в неё каналы, передаю из неё данные по каналам, извне закрываю каналы
алгоритм таков, что внизу, после завершения for i:=.......,
a) закрывается канал stopListen
б) в горутине запускается кейс <-stopListen
в) горутина передаёт данные в канал pingResult
г) основной код получает результат из pingResult, и только потом закрывает его
НО - у меня, блин, код паникует на строке pingResult <- j.Result(probes) — хотя, по идее, ну никак не может в этом месте канал оказаться закрытым =\
выглядит как адский оверинжениринг
Andrei 🦉
зачем вообще в горутину передавать пачку каналов, а потом закрывать их извне?
Sergei
Народ, подскажите, пожалуйста
Мне приходит строка вида "2006-01-02 15:05:05"
Мне надо ее записать в постгрес в таком же виде, но в формате time.Time
package main
import (
"fmt"
"time"
)
func main() {
result := string2time("2006-01-02 15:05:05")
fmt.Println(result)
}
func string2time(s string) *time.Time {
result, _ := time.Parse("2006-01-02 15:04:05", s)
return &result
}
Работает не совсем так
2006-01-02 15:05:05 +0000 UTC
Вот как мне получить time.Time без +000 UTC
Andrei 🦉
канал со входящими данными для горутины создается, хранится и завершается в методах этой структуры
Wingman
Andrei 🦉
в итоге получается простой и поддерживаемый кусок кода
Aleksandr
Sergei
или можно как-то?
Aleksandr
у тебя в базе какой тип?
Sergei
timestamp without time zone
Aleksandr
а как у тебя тогда туда записывается с зоной?
Sergei
вот и мне интересно :(
Sergei
Sergei
Sergei