
m
13.07.2018
15:11:27
или просто чтение из канала.
а с select работает иначе: бежится сверху вниз и проверяется, из какого канала можно прочитать данные. Еслини из какого, то он начинает ждать, пока в один из каналов не придут данные.
если же есть default, то он не ждёт, а выполняет то, что написано в default

Александр
13.07.2018
15:13:35
а насколько часто?

Google

Александр
13.07.2018
15:13:42
насколько будет успевать внешний цикл?

Glavnii
13.07.2018
15:14:13
https://groups.google.com/forum/#!topic/golang-dev/a5PqQuBljF4
Возможно было

m
13.07.2018
15:14:52

Александр
13.07.2018
15:15:08
default будет выполняться получается как for? сколько успеет итераций

m
13.07.2018
15:16:52

Александр
13.07.2018
15:19:26
for {
select {
...
default:
fmt.Println("no activity")
}
}
скорость вывода no activity будет равно скорости цикла
иным словами он заспамит?

m
13.07.2018
15:19:53
давай пока забудем про for. есть только select . в нём 1 case слушающий канал. Вопрос к тебе: как отработает эта конструкция.

Александр
13.07.2018
15:19:54
больше 1000 в секунду там

Google

m
13.07.2018
15:20:34
select {
case: _ <- c:
}

Александр
13.07.2018
15:21:02
ну и идеи он будет ждать там
пока что-то придет

m
13.07.2018
15:21:11
правильно
Второй вопрос.
как отработает тут:
select {
case: _ <- c:
default:
}

Александр
13.07.2018
15:22:18
по хорошему он должен опять сесть на первом же case и ждать пока придут данные
канал же false не вернул ?

m
13.07.2018
15:22:29
не правильно.
другие варианты.

Zver
13.07.2018
15:22:42
сразу отработает

Александр
13.07.2018
15:23:12
я сказал "по хорошему"
если там в языке не сделали исключения для select
а они сделали

m
13.07.2018
15:23:36
Вопрос к @ruelephant , почему Zver прав?

Zver
13.07.2018
15:23:46
В секцию дефаульт попадет.
Без ожидания.

Александр
13.07.2018
15:24:06
потому что блин для select они подпихнули хак
если бы обработка там была "на общих основаниях"
оно бы никогдане выполнилось
потому что чтение из канала без данных - лок

Google

m
13.07.2018
15:24:47
это не хак. Это отличная возможность читать из канала, если там что-то есть и работать дальше, если ничего нет.

Александр
13.07.2018
15:24:59
это как раз хак
исключение из правил
как бы я понимаю как оно работает кэп

m
13.07.2018
15:25:36
Я уже понял, что просто поговорить хочется. ?


Александр
13.07.2018
15:25:50
да блин, мне было интересно как в ядре ?
оформлено это
вообще мы не с этого начали
Но постойте, Go же ещё поддерживает select с дефолтным поведением, и если канал заблокирован, как горутина сможет обработать default? Хороший вопрос, давайте быстро посмотрим на приватное API каналов. Когда вы запускаете следующий кусок кода:
select {
case <-ch:
foo()
default:
bar()
}
Go запускает функцию со следующей сигнатурой:
func chanrecv(t *chantype, c *hchan, ep unsafe.Pointer, block bool)
chantype это тип канала (например, bool в случае make(chan bool)), hchan — указатель на структуру канала, ep — указатель на сегмент памяти, куда должны быть записаны данные из канала, и последний, но самый интересный для нас — это аргумент block. Если он установлен в false, то функция будет работать в неблокирующем режиме. В этом режиме горутина проверяет буфер и очередь, возвращает true и пишет данные в ep или возвращает false, если нет данных в буфере или нет отправителей в очереди. Проверки буфера и очереди реализованы как атомарные операции, и не требуют блокировки мьютекса.
Также есть функция для записи данных в очередь с аналогичной сигнатурой.
Мы разобрались как работают запись и чтение из канала, давайте теперь взглянём, что происходит при закрытии канала.
нашел вообщем ?


Zver
13.07.2018
15:29:29
Вообще там используется скорее всего что-то вроде trylock/

Александр
13.07.2018
15:29:39
нет не так, выше прочитай
вообщем это сахар над функцией

Andrew
13.07.2018
16:58:19

Daniel
13.07.2018
17:04:19
Рандомно, да
Ну и важно помнить, что чтение из закрытого канала всегда успешное

Alexey
13.07.2018
17:28:13

Катерина
13.07.2018
17:39:08
Что подготовить к собесу на Го?)

Александр
13.07.2018
17:39:34
для программиста? O_o
Голова, хотя бы одна рука и работоспособное тело

Google

Vladislav
13.07.2018
17:40:03
stackoverflow.tgz

Alexey
13.07.2018
17:40:31

Катерина
13.07.2018
17:41:06

Alexey
13.07.2018
17:42:13
А почему фулстек, если го?
Ну а так - горутины, каналы, селекты, структуры данных, SQL.

crxfoz
13.07.2018
17:44:06
Вопросик по swagger'у, первый раз использую.
Имеется следующая модель:
definitions:
Task:
title: Task
type: object
properties:
id:
type: string
status:
type: string
enum: ["done", "runned", "finished", "pending"]
И есть роут в котором я создаю новый таск, который возвращает 201 и ID нового таска (других полей не нужно). Каким образом можно связать в сваггере, что возвращаемый ID относиться к Task?
Или же будет нормальной практикой создать еще один definitions: TaskName, в нужном роуте возвращать его, а в Task указать ref на свойство?

Александр
13.07.2018
17:46:10

crxfoz
13.07.2018
17:47:09
вопрос из категории спортивного интереса

m
13.07.2018
19:06:54

Человек
13.07.2018
20:17:03
Вопрос какой тип нужно использовать дабы избежать эту ошибку - sql: Scan error on column index 1: unsupported Scan, storing driver.Value type <nil> into type? Код:
db.Exec("CREATE TABLE IF NOT EXISTS pdata (username varchar(255), password varchar(255))")
db.Exec("INSERT INTO pdata (username, password) VALUES ('Oleg', 'Hunter998')")
db.Exec("SELECT * FROM pdata")
for rows.Next() {
var id string
var username string
var password string
err := rows.Scan(&id, &username, &password)
if err != nil {
fmt.Println(err)
}
fmt.Printf("User: %v\n", username)
fmt.Printf("Password: %v\n", password)
}

Alan
13.07.2018
20:18:25

m
13.07.2018
20:40:53
Вопрос какой тип нужно использовать дабы избежать эту ошибку - sql: Scan error on column index 1: unsupported Scan, storing driver.Value type <nil> into type? Код:
db.Exec("CREATE TABLE IF NOT EXISTS pdata (username varchar(255), password varchar(255))")
db.Exec("INSERT INTO pdata (username, password) VALUES ('Oleg', 'Hunter998')")
db.Exec("SELECT * FROM pdata")
for rows.Next() {
var id string
var username string
var password string
err := rows.Scan(&id, &username, &password)
if err != nil {
fmt.Println(err)
}
fmt.Printf("User: %v\n", username)
fmt.Printf("Password: %v\n", password)
}
я не разбираюсь в брайверах БД, но код странный. Мне почему-то кажется, что перед вызовом rows.Next() должен идти запрос вида "SELECT что-то там".
а ошибка видимо в том, что в этом самом пропущееном селекте выбирается столбец id, которого нет в таблице pdata.

Человек
13.07.2018
20:42:51

Никита
13.07.2018
20:44:57
Его нельзя просто так положить в string например

m
13.07.2018
20:45:39
или там число, что логично для id

Никита
13.07.2018
20:46:21
Есть особые типы, как NullString, NullInt64

Google

Никита
13.07.2018
20:46:25
Их надо использовать

m
13.07.2018
20:46:33
добавь у столбцу ID в таблитце свойство AUTOINCREMENT и там тогда всегда будут циферки писаться при вставке новой строчки.

Человек
13.07.2018
20:47:23

m
13.07.2018
20:47:24
И код в примере конечно лучше полный и рабочий постить...
не знаю как в постгре. но праймари кеу - это признак уникальности и того, что индекс перавичный, а не того, что база сама туда будет придумывать и подставлять новые чиселки.
т.е. на одной строчке оно сработает и там будет NULL, а на второй -уже нет.

Человек
13.07.2018
20:50:04
Ааа, кажется что да, в постегре вроде SERIAL отвечает за AUTO_INCREMENT

m
13.07.2018
20:50:22
И как бы здорово столбец ID объявить с NOT NULL

Человек
13.07.2018
20:53:10

m
13.07.2018
20:53:26

Человек
13.07.2018
22:06:52
Как мне можно использовать fmt.Sprintf() как глобальную переменную? То есть у меня идет fmt.Sprintf() без значения, то есть оно должно быть как var s string не обозначая ничего и чтоб потом допустим в функции func1 мог использовать эту переменную пичкая аргументами, пример string:
var s string
func func1() {
s = "hello"
}

Evgeny
13.07.2018
22:38:34
не совсем понятно что ты хочешь
fmt.Sprintf() - функция ты не можешь объявить ее как тип данных и сувать ей аргументы

Yaroslav
13.07.2018
22:38:49

Kirill
13.07.2018
22:40:19