
Slach
28.04.2017
06:37:54

Valentin
28.04.2017
06:49:44

Sander
28.04.2017
13:48:41
php, nodejs, python
@BloodJazMan

Google

Che
28.04.2017
14:04:12
ребята, всем привет! объясните, пожалуйста, как обходиться без создания структур, если заранее неизвестно какие данные придут. весь гугл перерыл

Peter
28.04.2017
14:05:14
Не гоу-вэй

Daniel
28.04.2017
14:06:11
Если не известно, какие придут - откуда известно, как их обрабатывать?

Che
28.04.2017
14:06:17
ну как-то же можно?

Daniel
28.04.2017
14:06:31
Что именно можно?

Che
28.04.2017
14:06:37
обрабатывать

LexsZero
28.04.2017
14:06:55
можно. interface{}

Daniel
28.04.2017
14:07:02
Обрабатывать неизвестно что нельзя

Che
28.04.2017
14:07:15
допустим если известно что приходит csv, но csv всегда с разными колонками и на все не сделать никак одну структуру

Peter
28.04.2017
14:10:18

Che
28.04.2017
14:10:47

Peter
28.04.2017
14:11:59
Читаешь первую строчку, сощздаешь таблицу и читаешь дальше построчно, сплитя разделителем

Google

Peter
28.04.2017
14:16:41
Пиши на питоне, го для серьёзного бизнеса где нет неизвестных данных ?

Мерлин
28.04.2017
14:23:34
Читай в map, работай с ней

LexsZero
28.04.2017
14:24:58


Che
28.04.2017
14:54:15
подскажите, пожалуйста. не могу понять как итерировать в шаблоне. про {{ range }} понял (вроде), но в моем случае не работает.
router.GET("/testerr", func(c *gin.Context) {
db, _ := sqlx.Connect("postgres", AppConf.Scheme)
rows, err := db.Queryx("SELECT * FROM Errors")
if err != nil {
panic(err)
}
for rows.Next() {
var (
time string
mesage string
)
err = rows.Scan(&time, &mesage)
if err != nil {
panic(err)
}
c.HTML(200, "er.html", gin.H{
"cols": colNames("Errors"),
"rows": time,
"msgs": mesage,
})
}
})
шаблон
<html>
<body>
<table class="table table-hover">
<thead>
<tr>
{{ range $col := .cols }}
<th>{{ $col }}</th>
{{ end }}
</tr>
</thead>
<tbody>
<tr>
{{ range $row := .rows }}
<td>{{ $row }}</td>
{{ end }}
{{ range $msg := .msgs }}
<td>{{ $msg }}</td>
{{ end }}
</tr>
</tbody>
</table>
</body>
</html>
проблема в том, что executing "er.html" at <.rows>: range can't iterate over 21, то есть не итерируется. что я делаю не правильно?


Maxim
28.04.2017
14:55:57
подскажите, пожалуйста. не могу понять как итерировать в шаблоне. про {{ range }} понял (вроде), но в моем случае не работает.
router.GET("/testerr", func(c *gin.Context) {
db, _ := sqlx.Connect("postgres", AppConf.Scheme)
rows, err := db.Queryx("SELECT * FROM Errors")
if err != nil {
panic(err)
}
for rows.Next() {
var (
time string
mesage string
)
err = rows.Scan(&time, &mesage)
if err != nil {
panic(err)
}
c.HTML(200, "er.html", gin.H{
"cols": colNames("Errors"),
"rows": time,
"msgs": mesage,
})
}
})
шаблон
<html>
<body>
<table class="table table-hover">
<thead>
<tr>
{{ range $col := .cols }}
<th>{{ $col }}</th>
{{ end }}
</tr>
</thead>
<tbody>
<tr>
{{ range $row := .rows }}
<td>{{ $row }}</td>
{{ end }}
{{ range $msg := .msgs }}
<td>{{ $msg }}</td>
{{ end }}
</tr>
</tbody>
</table>
</body>
</html>
проблема в том, что executing "er.html" at <.rows>: range can't iterate over 21, то есть не итерируется. что я делаю не правильно?
Может не range $col := .cols а range _, $col := .cols?
Потому что модель итерации обычно for ITEM_ID, ITEM := range ITEMS


Che
28.04.2017
14:57:42
совсем непонятно как сделать select id, name from users и проитерировать это в таблицу в шаблоне


LexsZero
28.04.2017
15:01:41
подскажите, пожалуйста. не могу понять как итерировать в шаблоне. про {{ range }} понял (вроде), но в моем случае не работает.
router.GET("/testerr", func(c *gin.Context) {
db, _ := sqlx.Connect("postgres", AppConf.Scheme)
rows, err := db.Queryx("SELECT * FROM Errors")
if err != nil {
panic(err)
}
for rows.Next() {
var (
time string
mesage string
)
err = rows.Scan(&time, &mesage)
if err != nil {
panic(err)
}
c.HTML(200, "er.html", gin.H{
"cols": colNames("Errors"),
"rows": time,
"msgs": mesage,
})
}
})
шаблон
<html>
<body>
<table class="table table-hover">
<thead>
<tr>
{{ range $col := .cols }}
<th>{{ $col }}</th>
{{ end }}
</tr>
</thead>
<tbody>
<tr>
{{ range $row := .rows }}
<td>{{ $row }}</td>
{{ end }}
{{ range $msg := .msgs }}
<td>{{ $msg }}</td>
{{ end }}
</tr>
</tbody>
</table>
</body>
</html>
проблема в том, что executing "er.html" at <.rows>: range can't iterate over 21, то есть не итерируется. что я делаю не правильно?
ерунда какая-то написана. итерация работает по массивам/мэпам, а у тебя скаляр суется в rows


Che
28.04.2017
15:02:55
извините за глупые вопросы, я новичек

LexsZero
28.04.2017
15:03:55
а в самом шаблоне как итерировать?
{{range pipeline}} T1 {{end}}
The value of the pipeline must be an array, slice, map, or channel.
If the value of the pipeline has length zero, nothing is output;
otherwise, dot is set to the successive elements of the array,
slice, or map and T1 is executed. If the value is a map and the
keys are of basic type with a defined order ("comparable"), the
elements will be visited in sorted key order.
{{range pipeline}} T1 {{else}} T0 {{end}}
The value of the pipeline must be an array, slice, map, or channel.
If the value of the pipeline has length zero, dot is unaffected and
T0 is executed; otherwise, dot is set to the successive elements
of the array, slice, or map and T1 is executed.
https://godoc.org/text/template
https://play.golang.org/p/NmvRib2LF2 как-то так


Che
28.04.2017
15:21:12
вроде бы понятно, но не понятно только как обойтись без структуры Item. если у меня будет очень много всяких мелких таблиц, придется ведь на каждую такую создавать отдельную структуру. поправте если не прав

LexsZero
28.04.2017
16:02:28
один хрен модель на структурах расписывать чтоб орм прикрутить
не руками же все эти таблицы создавать и мигрейтить

Peter
28.04.2017
16:04:21
В нормальных языках делается так
>result = db.query("select id, login, password from users")
>for i in result: print(i[0], i[1],i[2])
Но Goв... не ищет лёгких путей. Сначала создай структуру, затем ссылку на нее, присвой в итерации значения полям и только тогда ты сможешь чет там принтануть. Такие дела, юный паддаван. Добро пожаловать в мир ебанутых.

LexsZero
28.04.2017
16:04:27
накрайняк можно юзать map[string]interfae{}, но зачем тогда го?

Google

LexsZero
28.04.2017
16:04:48
(и даже там уже так не делают давно)

Peter
28.04.2017
16:05:14

LexsZero
28.04.2017
16:05:33
понятия не имею, я не про конкретный язык, а про подход

Felix
28.04.2017
16:05:56
нигде так делать не надо

Peter
28.04.2017
16:06:32
Но дело даже не в этом
А в том, что питон позволяет так делать. А Go нет
Хозяину так не нравилось и он запретил

LexsZero
28.04.2017
16:07:34
позволяет, map[string]interface{}
хоть обделайся

Peter
28.04.2017
16:07:44
А потом стало религией

LexsZero
28.04.2017
16:09:09
Кек. Не сравнивай по сложности
ну если хочется динамической типизации - надо писать на языке с динамической типизацией, а не страдать что СЛОЖНОА ТИПЫ КАКИЕ-ТО

Peter
28.04.2017
16:09:47
Он первый начал!
Я, собственно, и говорю, что есть и другие языки и на них что-то проще делать

Nikolay
28.04.2017
16:12:24

Peter
28.04.2017
16:12:52

Nikolay
28.04.2017
16:13:17

Google

Nikolay
28.04.2017
16:13:25
а в Go есть толковые ORMы?

Peter
28.04.2017
16:13:37

Nikolay
28.04.2017
16:14:13
Почему?
потому что есть ORM и потому что руки кривые
в 2017 году SQL-инъекции в коде иметь - это ололо

Peter
28.04.2017
16:14:50
Ну да, если есть ОРМ, то его надо использовать

Admin
ERROR: S client not available

Felix
28.04.2017
16:14:50
Почему?
потому что
1) экранирование
2) миграции
3) деплой
4) удобство

Nikolay
28.04.2017
16:14:54
но, тем не менее, когда пишешь руками SQL - они есть часто

Peter
28.04.2017
16:15:53
Окэй, github.com/lib/pq это Орм?

LexsZero
28.04.2017
16:16:30
нет

Felix
28.04.2017
16:16:52
нет, написано же драйвер
орм - это то, где написано орм

LexsZero
28.04.2017
16:17:29
http://jinzhu.me/gorm/ например

Peter
28.04.2017
16:17:30
Но ведь там query("...", params) <= экранирование

Igor
28.04.2017
16:17:33
или https://github.com/go-pg/pg
экранирование - это обязанность любого драйвера

Peter
28.04.2017
16:18:09
То есть обычную либу западло, надо Орм тащить?

Google

Igor
28.04.2017
16:18:19
не надо, зачем. никто не заставляет.
ну, в смысле, если хочешь всего и сразу - тащи, если не хочешь - не тащи.

Peter
28.04.2017
16:18:35
Ну лан тогда

Felix
28.04.2017
16:18:58

Peter
28.04.2017
16:19:13
Кстати, а по базам данных есть отдельный чатик?

Igor
28.04.2017
16:38:16
https://github.com/A-gambit/awesome-telegram-chats

Aleksey
28.04.2017
16:45:47
Друзья , такой вопрос. Есть линукс сервер - 1шт. Есть 3 разных golang приложений , есть 3 домена. Как это все лучше деплоить на одном сервере?

m
28.04.2017
16:46:48
nginx и 3 демона на разные порты локалхоста.

Igor
28.04.2017
16:46:55
поставить nginx?

m
28.04.2017
16:47:32
создать сервера для каждого домена в nginx-е и проксировать к своим демонам.

Aleksey
28.04.2017
16:47:41

m
28.04.2017
16:47:56
что может?

Aleksey
28.04.2017
16:48:12

LexsZero
28.04.2017
16:48:16
а три демона слушать на одном 80 не могут

Igor
28.04.2017
16:48:17

Mikhail
28.04.2017
16:48:23

LexsZero
28.04.2017
16:48:46
потом потребуется ssl, отдача статики и какое-нибудь кеширование - все равно нжинкс ставить

Igor
28.04.2017
16:48:53