
Anton
22.01.2018
18:11:44
А почему с ноды переписывать хотите?
Писали давно с коллегой, ещё мало что понимали в этом деле, понаписали велосипедов, а сейчас нужно впиливать новый функционал, который в текущую кодовую базу вписывать очень больно. В любом случае нужно переписать с нуля, вот решили на Go

Demuz
22.01.2018
18:14:30
Ооо, здорово.

Anton
22.01.2018
18:16:10
Так мб подскажете какие-нибудь репо проектов небольшой-средней величины, в основном, конечно, CRUD операции с валидацией пользовательских данных

Demuz
22.01.2018
18:19:50
Лично я такие не встречал. Пишу сам просто и все.

Google

Yury
22.01.2018
18:57:36

nezorflame
22.01.2018
18:58:27
скинул бы пример на 5к строк, да реп приватный
в общем, можно, но не всегда нужно

Yury
22.01.2018
18:59:09
Скорее почитайте как вообще архитектуру строить большую. Или возьмите фреймворк на го, который уже навязвает подход.

Anton
22.01.2018
18:59:43
например, так:
project
├── routes.go
├── routes_stories_create.go
├── routes_stories_delete.go
├── routes_stories_update.go
└── routes_stories_[...].go

Yury
22.01.2018
19:00:36
скорее всего быстрее, но на уровне погрешности, видно наверное будет только на супер точных тестах

Anton
22.01.2018
19:00:58
если к каждому файлу добавить ещё файл _test.go, то совсем каша

nezorflame
22.01.2018
19:01:24
божечки

Yury
22.01.2018
19:01:37
и зачем все складировать в корне?

Demuz
22.01.2018
19:02:16

nezorflame
22.01.2018
19:02:27
есть несколько подходов к структурированию

Google

nezorflame
22.01.2018
19:02:36
каждый со своего предыдущего языка тянет свой

Yury
22.01.2018
19:03:03
я бы сказал, что их не несколько, а дох;я)

Anton
22.01.2018
19:03:39
в го же тоже есть модули? Вы про какие модули?)
да, я понимаю, что можно разбить на разные пэкэджи, но скажем если я сделаю отдельный package routes, а он много от чего зависит, что определяется в package main, скажем, он базы данных, то надо в него передавать все эти переменные

Demuz
22.01.2018
19:03:56

nezorflame
22.01.2018
19:04:39
https://github.com/boltdb/bolt
пример, когда все в корне (кроме бинаря)

Demuz
22.01.2018
19:04:51
Или так даже еще понятней теперь что там тестится? Помоему каши нет.

Yury
22.01.2018
19:06:21
ну да, такой си стиль, но для среднего проекта уже начнет казаться жутью

nezorflame
22.01.2018
19:07:06

Anton
22.01.2018
19:09:11
я правильно понимаю, что, например, models, routers — это отдельные package?

nezorflame
22.01.2018
19:09:24
разумеется

Anton
22.01.2018
19:11:01
вот. например вы открываете базу в package db, как вы её потом передаёте в routers? у вас же рауты должны использовать базу

Yury
22.01.2018
19:12:08
берем инстанс из db?

Anton
22.01.2018
19:13:46
например так:
package routers
var (
db *gorm.DB
)
func receiveDb(dbRef *gorm.DB) {
db = dbRef
}

Yury
22.01.2018
19:14:00
https://stackoverflow.com/questions/31218008/sharing-a-globally-defined-db-conn-with-multiple-packages-in-golang

Anton
22.01.2018
19:14:02
?

Demuz
22.01.2018
19:14:15
А берется указатель на память.

Anton
22.01.2018
19:17:36
да, я понял. makes sense.

Google

Demuz
22.01.2018
19:18:22
Если вам удобно, вы можете возвращать инстанс соединения с бд в любую точку приложения, через метод к примеру. Но я сам так не делаю. Сейчас покажу.

Anton
22.01.2018
19:21:17
да, понятно, спасибо.

Demuz
22.01.2018
19:22:49
Кстати, что есть best practice в "компилируемых" REST бекендах? Открывать\закрывать базу при каждом запросе, либо открыть только 1 раз при запуске приложения?

nezorflame
22.01.2018
19:23:04
открывать и держать

Demuz
22.01.2018
19:23:20
Эх, а я постоянно заново открываю )))

Yury
22.01.2018
19:23:25

Demuz
22.01.2018
19:23:53
Так ему и с фреймворком нужно будет конектиться к бд же )
открывать и держать
Получается инстанс соединения с бд нужно будет "мьютить" при работе с ним? Или как?

Alexey
22.01.2018
19:26:12
Там по дефолту пул коннектов
Можно использовать параллельно прозрачно для себя

Demuz
22.01.2018
19:26:46
то есть это совсем не как со случаем с добавлением в массив да?
О, одной болью меньше )

Alexey
22.01.2018
19:26:59
Ага
Про пул надо проверить, правда, сколько он держит, вот это всё
Я не помню)

Demuz
22.01.2018
19:27:56
открывать и держать
Ахха. Теперь я понимаю что нет особо смысла соединять по unix сокету, если он 1 раз содинился и держит коннект )

nezorflame
22.01.2018
19:28:03
именно

Google

Anton
22.01.2018
19:28:38
и ещё у меня был вопрос — про валидацию пользовательских данных на раутах. изобрёл как-то так, используя gojsonschema, но мне почему-то кажется, что тут слишком много происходит:
package main
import (
"encoding/json"
"net/http"
"github.com/xeipuuv/gojsonschema"
)
func createStoryHandler(w http.ResponseWriter, r *http.Request) {
story := Story{}
documentLoader, reader := gojsonschema.NewReaderLoader(r.Body)
decodeErr := json.NewDecoder(reader).Decode(&story)
validationResult, err := createStorySchema.Validate(documentLoader)
if err != nil {
panic(err)
}
if !validationResult.Valid() {
handleValidationError(validationResult)
return
}
if decodeErr != nil {
panic(decodeErr)
}
if err := db.Create(&story).Error; err != nil {
panic(err)
}
w.WriteHeader(http.StatusCreated)
}

Demuz
22.01.2018
19:28:45
именно
А самые частые ошибки какие? Вот резко падает база. Там как окннекшн клозет будет?
или nil pointer?

Alexey
22.01.2018
19:29:04

Demuz
22.01.2018
19:29:37
Все равно по сокету шустрее)
Так по unix сокеты коннектят, потому что он время на самом коннекте экономит вроде А что еще можно там сэкономить? )

Anton
22.01.2018
19:29:38

Admin
ERROR: S client not available

Yury
22.01.2018
19:29:56
а ну тогда правильно

Anton
22.01.2018
19:30:17

Alexey
22.01.2018
19:30:23

Andrew
22.01.2018
19:30:41
А есть книги по архитектуре в го?

Demuz
22.01.2018
19:30:46

nezorflame
22.01.2018
19:31:18
если по стандартной либе
а не всяким ОРМ
то вот
https://golang.org/pkg/database/sql/#Open

Demuz
22.01.2018
19:31:24

Alexey
22.01.2018
19:34:01

Demuz
22.01.2018
19:35:29
Но думаю опыт не помешает.
Там ска в sql драйвере стандартном в примере мелкую ошибку они сделали, не увидел ее, задолбался искать )

Google

Demuz
22.01.2018
19:37:55

nezorflame
22.01.2018
19:38:46
он не стандартный
впрочем, юзается много где
вот список https://github.com/golang/go/wiki/SQLDrivers

Yury
22.01.2018
19:40:49


nezorflame
22.01.2018
19:41:26
там повеселее issue были https://github.com/go-sql-driver/mysql/issues/657

Yury
22.01.2018
19:43:21

nezorflame
22.01.2018
19:43:48
иногда приходится
я, правда, еще себя профи не считаю :)

Demuz
22.01.2018
19:48:34
а профи велосипеды пишут?)
Думаю программирование больше похоже на конструктор из уже имеющихся лего блоков, чем на сборку и модернизацию велика. )

Yury
22.01.2018
19:56:06
минутка философии: так то все в этом мире конструктор из готовых блоков

Vladimir
22.01.2018
19:56:41
на минутку, атом - тоже готовый блок

Sparrow
22.01.2018
20:00:20
собранный из кварков

Demuz
22.01.2018
20:01:53
Всё, мне объяснили что такое валидатор )

Aleksandr
22.01.2018
21:59:09
We have just released Go version 1.9.3, a minor point release.
This release includes fixes to the compiler, runtime, and the database/sql,
math/big, net/http, and net/url packages.
View the release notes for more information:
https://golang.org/doc/devel/release.html#go1.9.minor