Size: a a a

2020 April 13

x

x-foby in Go-go!
Мимо Проходящий
Правильный способ - filepath.Dir(os.Args[0])
О чём и написано в ответе на SO по ссылке выше
источник

МП

Мимо Проходящий... in Go-go!
Evgeniy
Всем привет! Ребят, не могли бы посмотреть мой проект. И дать рекомендации по коду, я новичок просто. Заранее спасибо https://github.com/avasites/univer
а зачем на каждый реквест
db := models.GetConnection()
defer db.Close()

? Это же не эффективно. Почему бы не сделать одну глоб. переменную с конекшеном к бд и использовать её для всех реквестов?
источник

E

Evgeniy in Go-go!
Мимо Проходящий
а зачем на каждый реквест
db := models.GetConnection()
defer db.Close()

? Это же не эффективно. Почему бы не сделать одну глоб. переменную с конекшеном к бд и использовать её для всех реквестов?
Спасибо постараюсь переделать)
источник

E

Evgeniy in Go-go!
Мимо Проходящий
Правильный способ - filepath.Dir(os.Args[0])
Спасибо)
источник

x

x-foby in Go-go!
Мимо Проходящий
а зачем на каждый реквест
db := models.GetConnection()
defer db.Close()

? Это же не эффективно. Почему бы не сделать одну глоб. переменную с конекшеном к бд и использовать её для всех реквестов?
Если нужно одно соединение, то проще регистрировать обработчики для роутов с прокидыванием к ним локально созданного соединения, чем заводить глобальную переменную.
Это позволяет избежать глобального состояния и потенциальных циклических зависимостей.

func main() {
 db, _ := sql.Open(...)
 http.HandleFunc("/search", handler1(db))
}

func handler1(db *sql.DB) func(http.ResponseWriter, *http.Request) {
 return func(http.ResponseWriter, *http.Request) {
   // логика
 }
}
источник

а

а кто это in Go-go!
а можно просто сделать контроллер с полем
источник

x

x-foby in Go-go!
а кто это
а можно просто сделать контроллер с полем
Можно
источник

а

а кто это in Go-go!
ну и да, гонять SQL напрямую из хендлера тоже не очень
источник

E

Evgeniy in Go-go!
а кто это
ну и да, гонять SQL напрямую из хендлера тоже не очень
а можно поподробнее?
источник

x

x-foby in Go-go!
а кто это
ну и да, гонять SQL напрямую из хендлера тоже не очень
Всё зависит от масштабов проекта.
В данном случае разговор о глобальной переменной с коннектом к БД и о том, как этого избежать.
источник

МП

Мимо Проходящий... in Go-go!
x-foby
Если нужно одно соединение, то проще регистрировать обработчики для роутов с прокидыванием к ним локально созданного соединения, чем заводить глобальную переменную.
Это позволяет избежать глобального состояния и потенциальных циклических зависимостей.

func main() {
 db, _ := sql.Open(...)
 http.HandleFunc("/search", handler1(db))
}

func handler1(db *sql.DB) func(http.ResponseWriter, *http.Request) {
 return func(http.ResponseWriter, *http.Request) {
   // логика
 }
}
Можно конечно и передавать в каждую функцию db. Но можно != нужно. Цикличиские зависимости в го не пропускаются конпилятором, а стейт уровня пакета элементарно изолируется. Поэтому чтобы передавать db в каждую функции, надо сперва найти для этого веские основания.
источник

а

а кто это in Go-go!
Evgeniy
а можно поподробнее?
сделать интерфейс-репозиторий
источник

E

Evgeniy in Go-go!
а кто это
сделать интерфейс-репозиторий
Спасибо
источник

а

а кто это in Go-go!
это, например, упростит тестирование хендлеров/контроллера
источник

C

Calculon in Go-go!
интерфейс всему голова
источник

x

x-foby in Go-go!
Мимо Проходящий
Можно конечно и передавать в каждую функцию db. Но можно != нужно. Цикличиские зависимости в го не пропускаются конпилятором, а стейт уровня пакета элементарно изолируется. Поэтому чтобы передавать db в каждую функции, надо сперва найти для этого веские основания.
Я в курсе, что циклические зависимости не пропускаются.
О том и речь, что чтоб их не было в маломальски серьёзном проекте придётся выносить коннект к базе в отдельный пакет.

И вот мы можем передать всё в хендлер или будем вынуждены определять отдельный пакет и затачиваться на него. По-моему из этих двух вариантов наихудший очевиден.
источник

а

а кто это in Go-go!
передавать все в хендлер?
источник

МП

Мимо Проходящий... in Go-go!
x-foby
Я в курсе, что циклические зависимости не пропускаются.
О том и речь, что чтоб их не было в маломальски серьёзном проекте придётся выносить коннект к базе в отдельный пакет.

И вот мы можем передать всё в хендлер или будем вынуждены определять отдельный пакет и затачиваться на него. По-моему из этих двух вариантов наихудший очевиден.
в общем случае не очевиден. В данном очевиден - чем сложнее, чем больше кода, тем хуже
источник

x

x-foby in Go-go!
Ок
источник

МП

Мимо Проходящий... in Go-go!
одну глоб. переменная с конекшеном к бд - меньше кода чем нежели создавать db в main-е и передавать в каждую функцию, обращающуюся к бд. Соответственно в данном случае это лучше. Вроде всё просто
источник