
Vladimir
21.10.2018
22:02:35
for i:=0;i<len(funcs);i++ {
l:=make(chan int)
channels = append(channels,l )
go funcs[i](l)
}
тут вообще плохо читаеься потому как вы совместили создание слайса с запуском функций, а никак не индексное определение

ivan
21.10.2018
22:06:47
я понимаю что у них ответственность разная, но не 2 же цикла для этого делать? И почему итерирование через i > чем через range? производительнее?

Vladimir
21.10.2018
22:08:08

Google

Vladimir
21.10.2018
22:10:51
ну вобщем дело вкуса ☺️
вобщем сойдет !

ivan
21.10.2018
22:21:36
Да, не смогу, т.е. пример с выше где используется 2 канала профитнее, почему тогда его использовать плохая практика?
;D ну есть какие-то общиепринятые понятия и best practices, хочется сразу на светлую сторону встать. В любом случае спасибо

anatolii
21.10.2018
23:25:22
Зачем в рутины оборачивать?

Vladimir
21.10.2018
23:25:51

anatolii
21.10.2018
23:26:21
Какой обработчик? ?


Vladimir
21.10.2018
23:27:22
я код смотрел TCP сервера? и ляпнул, перепутал парня с другим кем обсуждал UDP сервер
в парсере конечно сразу GET
client := &http.Client{}
resp, err := client.Get("xxxxxxxx")
if err == nil {
htmlData, err2 := ioutil.ReadAll(resp.Body)
...
resp.Body.Close()
}
;D ну есть какие-то общиепринятые понятия и best practices, хочется сразу на светлую сторону встать. В любом случае спасибо
дело не в best practize а в том что твой пример получает данные с двух рутин в синхронном режиме сначала от одной все (другая в это время стоит), затем от другой все? , а иногда нужна асинронность, которая может не оставить камня на камне!
package main
import (
"fmt"
)
func main() {
exit := make(chan int)
channels := []chan int{}
funcs := []func(c chan int, exit chan int){
test1,
test2,
}
for i, fn := range funcs {
channels = append(channels, make(chan int))
go fn(channels[i], exit)
}
res := []int{}
res = append(res, k(channels, exit)...)
fmt.Println(res, len(res))
}
func test1(c chan int, exit chan int) {
for i := 0; i < 1000; i++ {
c <- i
}
exit <- 1
}
func test2(c chan int, exit chan int) {
for i := 1000; i < 2000; i++ {
c <- i
}
exit <- 1
}
func k(c []chan int, exit chan int) []int {
var v int
ex := 0
t := []int{}
for ex < 2 {
select {
case v = <-c[0]:
t = append(t, v)
case v = <-c[1]:
t = append(t, v)
case <-exit:
ex++
}
}
close(c[0])
close(c[1])
return t
}


Roman
22.10.2018
01:29:50

Google


Александр
22.10.2018
03:54:29
дело не в best practize а в том что твой пример получает данные с двух рутин в синхронном режиме сначала от одной все (другая в это время стоит), затем от другой все? , а иногда нужна асинронность, которая может не оставить камня на камне!
package main
import (
"fmt"
)
func main() {
exit := make(chan int)
channels := []chan int{}
funcs := []func(c chan int, exit chan int){
test1,
test2,
}
for i, fn := range funcs {
channels = append(channels, make(chan int))
go fn(channels[i], exit)
}
res := []int{}
res = append(res, k(channels, exit)...)
fmt.Println(res, len(res))
}
func test1(c chan int, exit chan int) {
for i := 0; i < 1000; i++ {
c <- i
}
exit <- 1
}
func test2(c chan int, exit chan int) {
for i := 1000; i < 2000; i++ {
c <- i
}
exit <- 1
}
func k(c []chan int, exit chan int) []int {
var v int
ex := 0
t := []int{}
for ex < 2 {
select {
case v = <-c[0]:
t = append(t, v)
case v = <-c[1]:
t = append(t, v)
case <-exit:
ex++
}
}
close(c[0])
close(c[1])
return t
}
как всегда вернемся к бизнес задачи
зачем вам такой асинхрон?
может быть вместо нескольких каналов надо таки один, но не блокировать все в основном лупе (вынести обработчик за гоурутину)


Vladimir
22.10.2018
04:25:07
Добрый день. Подскажите как правильно использовать прокси в https соединении.
func getClient() (*http.Client, error) {
if client == nil {
prx, err := url.Parse(urlProxy)
if err != nil {
return nil, err
}
transport := &http.Transport{
Proxy: http.ProxyURL(prx),
TLSClientConfig: &tls.Config{},
}
client = &http.Client{
Transport: transport,
}
client = &http.Client{}
}
return client, nil
}
Использую прокси в настройках клиента, соединение не проходит, если указать прокси через переменную окружения соединение устанавливается. В какую сторону капать?


Roman
22.10.2018
04:55:04
Добрый день. Подскажите как правильно использовать прокси в https соединении.
func getClient() (*http.Client, error) {
if client == nil {
prx, err := url.Parse(urlProxy)
if err != nil {
return nil, err
}
transport := &http.Transport{
Proxy: http.ProxyURL(prx),
TLSClientConfig: &tls.Config{},
}
client = &http.Client{
Transport: transport,
}
client = &http.Client{}
}
return client, nil
}
Использую прокси в настройках клиента, соединение не проходит, если указать прокси через переменную окружения соединение устанавливается. В какую сторону капать?
кстати, почему не писать код в стиле early return?
func getClient() (*http.Client, error) {
if client != nil {
return client, nil
}
/*do all the stuff*/
}

Александр
22.10.2018
04:56:07
проверь что ты прокси правильно устаналиваешь
туда кормиться тип *url.URL,
распечатай, убедись что все нормально спарсилось

/dev/null
22.10.2018
05:05:54
Ребят, чот не пойму как с этим бороться
[ERROR] xml: name "patient" in tag of pix.AddPatient.Patient conflicts with name "PatientDto" in *pix.Patient.XMLName
type AddPatient struct {
XMLName xml.Name `xml:"http://teri.org/ AddPatient"`
}
type Patient struct {
XMLName xml.Name `xml:"http://schemas.datacontract.org/2004/07/Service.Data.Dto PatientDto"`
}

Vladimir
22.10.2018
05:18:50
Изначально был косяк когда urlProxy был без схемы

Artem
22.10.2018
05:38:26

/dev/null
22.10.2018
06:11:39

Vadim
22.10.2018
06:30:41
Вроде бы статья совсем не про Го, открываю комментарии там идёт срач как го всех победит. Так держать. Го в массы?
Electron это Flash для десктопа
https://habr.com/post/427211/

Michael
22.10.2018
06:33:44

Vladimir
22.10.2018
06:34:05

Daniel
22.10.2018
06:34:32

Google

Daniel
22.10.2018
06:36:22
@madgopher , @kirilldanshin , у нас доклад 8 ноября в 14:00 в зале на 360 человек
ты готов?

Kirill
22.10.2018
06:45:39
Но в остальном ок же)

Artem
22.10.2018
06:51:52
Лол

Kirill
22.10.2018
06:59:59
Ну а что, с меня же часть контента всё равно)

Kirill
22.10.2018
07:40:46

Bohdan
22.10.2018
07:41:33

Kirill
22.10.2018
07:41:45
офис 365 или как он там

Bohdan
22.10.2018
07:42:03
а, ну так офис 365 он ведь для веба, не?

Kirill
22.10.2018
07:42:21

Andrey
22.10.2018
07:44:50

Bohdan
22.10.2018
07:45:06
но это оффтоп, ладно

Michael
22.10.2018
07:59:40

Vladimir
22.10.2018
08:13:27

Artem
22.10.2018
08:16:54
а есть разница?
кор тим го старалась, добавила хоть какой-то сахар в язык, а тут его выкидывают.
формально, то вроде len() не вычисляется каждую итерацию, как в твоем примере

Vladimir
22.10.2018
08:19:17

Artem
22.10.2018
08:20:32

Google

Artem
22.10.2018
08:21:14
а вот если ты идешь по массиву и меняешь в процессе i, то должны быть веские аргументы так делать

Vladimir
22.10.2018
08:24:00

Artem
22.10.2018
08:25:04

Vladimir
22.10.2018
08:26:10

Roman
22.10.2018
08:26:25
какая-то дичь у вас

Pavel
22.10.2018
08:28:32
зачем напрягаться

Roman
22.10.2018
09:02:08

Artem
22.10.2018
09:05:17

Vladimir
22.10.2018
09:05:20

Roman
22.10.2018
09:08:46
зачем? почему не исходники кубера, например?

Vladimir
22.10.2018
09:09:33

Roman
22.10.2018
09:10:07

Vyacheslav
22.10.2018
09:10:39
Ого.

Artem
22.10.2018
09:10:41

Vladimir
22.10.2018
09:11:06
так можно, но зачем?
только когда вы безработны или пенсионер, в остальных случаях бесполезная трата времени
https://repl.it/@Delimiter/Sumdoku

Roman
22.10.2018
09:15:24
а гошные массивы эквивалентны сишным?

Mykyta
22.10.2018
09:15:36

Roman
22.10.2018
09:15:55
т.е. [4][4] это то же самое что [16] ?

Google

Mykyta
22.10.2018
09:16:28
можно проверить через unsafe.Ptr

Илья
22.10.2018
09:17:58

Vladimir
22.10.2018
09:18:47
фото выше

Roman
22.10.2018
09:19:42

Илья
22.10.2018
09:20:20
э, вы gotour, вроде бы, прошли, вы знаете чем заполнен в go массив? ну, присвоение пустых структур я бы еще понял, а это просто си код

Roman
22.10.2018
09:20:29
https://play.golang.org/p/qG6ktGsVGT4

Vladimir
22.10.2018
09:22:54