
Wingman
23.08.2018
22:22:53
Вангую, ченить типа st.Close()

Nazary
23.08.2018
22:23:01
это везде где препер?

Wingman
23.08.2018
22:23:13
Угу
Нах ты их вообще готовишь в цикле

Google

Wingman
23.08.2018
22:23:30
Они не для этого
Один раз готовь, а дальше вызывай с разными переменными

Nazary
23.08.2018
22:24:52
ой бляха
вот это я дибил
Благодарю

Wingman
23.08.2018
22:25:14
Бгг
$100
:)

Crypt
23.08.2018
22:26:36
? зачот

Kirill
23.08.2018
22:27:59


Petr
24.08.2018
07:41:48
Всем привет!
Сейчас в поиске крутых Golang-разработчиков в российскую IT-шную компанию IBCLabs, которая занимается созданием различного инструментария для трейдинга (алготрейдинг, торговля криптовалютой и т. д.), платежных систем для России и трансграничных платежей, инвестиционные продукты (в том числе связанные и с криптовалютой) Основная цель компании - запуск собственных fintech продуктов в сегментах B2B и B2C.
На данный момент крупный проект по разработке крупной площадки для торговли различной валютой. Сейчас команда из 14 человек (помимо разработчиков есть QA, DevOps, аналитики), ищем одного ведущего/лида (с перспективой в ближайшее время роста до тимлида) и одного уровня middle+.
Разработка по SCRUM, недельные спринты, процессы CI/CD настроены. Стек технологий: Go, PostgreSQL, Tarantool, Nginx, RabbitMQ.
Условия: комфортный офис в центре Москвы на 25ом этаже БЦ (клевый вид на столицу обеспечен), оформление по ТК РФ, гибкий график (вся команда обычно в офисе с 12:00 до 18:00, остальное время по желанию), ЗП обсуждается на собеседовании (вилка 150-300к, зависит от уровня скиллов и бекграунда)
Если вакансия заинтересовала и у вас опыт разработки от ~4 лет (из них последние 1-2 года именно на Go), пишите мне в ЛС, обещаю оперативно отвечать :)
#go #golang #офис #Москва #фуллтайм #fulltime #работа #вакансия


Kirill
24.08.2018
07:59:30
Ребят, простите за нубский вопрос... Но уже и интернет перерыл, ваш чат в том числе и февральскую переписку. Я не могу понять как мне задать глобальную переменную конфига, который бы был виден во всех пакетах моего приложения.
Структура такая:
корень проекта - main
в корне две папки controllers и models.
В пакете models
описаны структуры
type Config struct {
Port string json:"port"
Db Db json:"db"
}
type Db struct {
Host string json:"host"
User string json:"user"
Pass string json:"pass"
Dbname string json:"dbname"
}
и функция
func LoadConfig() (config *Config, err error) {
configFile, err := ioutil.ReadFile("./static/settings.local.json")
if err == os.ErrNotExist {
configFile, err = ioutil.ReadFile("./static/settings.json")
}
PanicOnErr(err)
err = json.Unmarshal(configFile, &config)
return config, err
}
В пакете main есть переменная и ее инициализация
var GlobConf *models.Config
func main() {
GlobConf, _ := models.LoadConfig()
valPort := []string{":", GlobConf.Port}
listenPort := strings.Join(valPort, "")
тут все работает... Но в функциях пакета controllers переменная GlobConf не видна. Как правильно использовать эту переменную?
Может ее надо было определять не в main, а в models и дальше models.GlobConf.Db...
Может ее надо в controllers как-то проинициализировать из пакета main?

Google

Daniel
24.08.2018
08:03:45
1. Определить не в main
2. Обычно глобальный конфиг не нужен

Alexander
24.08.2018
08:03:45
Ну можно в мейне проинициализировать все необходимые структуры из соседних пакетов, передав туда в коструктор конфиг

Daniel
24.08.2018
08:04:02
Конструктор?

Alexander
24.08.2018
08:04:27
ну controller.New() :)

Zarif
24.08.2018
08:06:41
не совсем понял что конкретно нужно, но если требуется какая-то глобальная переменная, то проще определить её в переменной окружения, а потом через os.Getenv брать её где угодно


Аня
24.08.2018
08:08:33
Коллеги, привет! Меня зовут Аня, я веду поиск Golang-разработчика в Команду сайта банка ТОП-3.
По функционалу - backend-разработка на Go. Коллеги переписывают сайт с node.js на golang. Проект масштабный, стратегически важный для компании. Уровень позиции: Middle / Senior. Если Ваш уровень по Golang-разработке выше, давайте знакомится, в портфеле проектов есть вакансии и для вас) Требования: опыт Golang от 1-2 лет, знание Go (структуры, интерфейсы, каналы, горутины и т.д.), понимание принципов работы клиент-серверной архитектуры, микросервисов, конкурентности.
Условия: белая зп (вилка до 180-200 гросс по итогам технического интервью), ДМС, страхование жизни, страхование выезжающих за рубеж, 10 дней в году больничного 100% компенсируем.
Ребята, кому интересно - за подробной инфой Go в личку @very_ann #go #golang #офис #Москва #fulltime #работа #вакансия


Kirill
24.08.2018
08:09:02
не совсем понял что конкретно нужно, но если требуется какая-то глобальная переменная, то проще определить её в переменной окружения, а потом через os.Getenv брать её где угодно
У меня в конфиге прописаны настройки подключения, порт, параметры подключения к БД (юзер, пасс, хост, имя бд).
порт нормально заработал. А вот в функции
http.HandleFunc("/api/v2/auth/login", controllers.AuthLogin)
AuthLogin устанавливается соединение с БД, и сразу закрывается. Так вот для подключения необходимо передать параметры подключения

Eldar
24.08.2018
08:09:44

Лемур
24.08.2018
08:10:39

Eldar
24.08.2018
08:11:05
кек

Kirill
24.08.2018
08:12:36

Zarif
24.08.2018
08:13:20

Лемур
24.08.2018
08:14:36
1. Как параметр или выделить в пакет и подключать где надо.
2. Вам надо прочитать как go разруливает эти моменты.
*sql.DB - это пул подключений. Подключение не висит постоянно. Автоматически открывается при запросе и висит только до таймаута. Таймаут и максимальное кол-во подключений настраивается. При ожидании свободного подключения рутина блокируется.
не забывайте stmt закрывать

Kirill
24.08.2018
08:16:39
Но хочется исправить на "правильный" вариант использования Go ;)

Лемур
24.08.2018
08:17:55

Alexander
24.08.2018
08:18:01
ну dependency injection надо погуглить прост

Aleksandr
24.08.2018
08:18:01
используй di - это правильный вариант в любом языке
конфиг получай в main, все остальные настройки передавай извне во время инициализации параметрами фабрики

Google

Лемур
24.08.2018
08:18:50

Kirill
24.08.2018
08:24:00
А есть более красивый вариант вот этого
valConnectionString := []string{Config.Db.User, ":", Config.Db.Pass, "@", Config.Db.Host, "/", Config.Db.Dbname}
conn, _ := sql.Open("firebirdsql", strings.Join(valConnectionString, ""))
Т.е. у меня есть параметры, мне надо их соединить, с помощью разных разделителей

Alexandr
24.08.2018
08:26:07
fmt.Sprintf?

Kirill
24.08.2018
08:26:38

Alexandr
24.08.2018
08:27:06
Sprint* возвращает результат в качестве строки

Kirill
24.08.2018
08:27:34

Fastumkruk ✅
24.08.2018
09:22:17
Всем привет. Слушаю localhost:8085, как сделать что бы обработка запроса была только от localhost, с других источников был бы ретурн?

Wingman
24.08.2018
09:23:21
если ты слушаешь только локалхост, другие источники до тебя не достучатся

Fastumkruk ✅
24.08.2018
09:29:58

Алексей
24.08.2018
09:30:09
Господа, часто ли вы используете константы вместо переменных внутри функций? (там где это возможно)
Случайно взглянул в код на JS, у них там принято по всюду юзать константы внутри локальных областях видимости.
Интересно, с чем это связано, ведь в го, такое встречается крайне редко, по крайне мере - мне.

Wingman
24.08.2018
09:30:18

Wingman
24.08.2018
09:30:33
либо проксить nginx'ом

Илья
24.08.2018
09:31:52

Алексей
24.08.2018
09:32:15
После увиденного решил подойти к местным js разрабам, они удивились, что мы так не делаем и скзаали, что считают это говнокодом.

Fastumkruk ✅
24.08.2018
09:32:18

Алексей
24.08.2018
09:32:29

Wingman
24.08.2018
09:33:49
но я бы тебе посоветовал на iptables посмотреть

Илья
24.08.2018
09:34:24
можно по подробнее?
я не настоящий джиесер, но константы в js хоть и ограничены скоупом, должны кешироваться, насколько я помню, в отличие от var

Google

Илья
24.08.2018
09:34:49
ну и современные фронтендеры топят за семантику, типо если это не должно меняться, лепи const

Алексей
24.08.2018
09:34:53

Илья
24.08.2018
09:34:58
да

Алексей
24.08.2018
09:35:04
мм

Daniel
24.08.2018
10:00:18
у нас константы похуже - они бывают только базовых типов

Admin
ERROR: S client not available

Daniel
24.08.2018
10:02:00
так-то я бы тоже все, что меняться не должно, обозначал бы соответствующим образом

Никита
24.08.2018
10:07:45
Кстати, почему константы есть только для базовых типов?

F01134H
24.08.2018
10:08:56
что значит только для базовых?

Никита
24.08.2018
10:09:27
То и значит
Для строк, чисел
Создать константу с массивом или мапой нельзя

Daniel
24.08.2018
10:10:08

Andrey
24.08.2018
10:13:18
Добрый день! А киньте в меня, плиз, либой которая умеет парсить /proc/net/(tcp,udp,tcp6,udp6)

Vasilii
24.08.2018
10:18:38
https://github.com/prometheus/procfs

Roman
24.08.2018
10:23:31

Andrey
24.08.2018
10:27:11

Илья
24.08.2018
11:44:57
тип выводится в месте использования

Google

Daniel
24.08.2018
11:49:07
типизованные константы тоже есть

Илья
24.08.2018
11:52:42
хм, да, я не прав, можно типизировать :S

Denys
24.08.2018
12:10:06
есть ридер и врайтер, но чтобы запись во врайтер с буффером была по делиметру

Илья
24.08.2018
12:12:26
берешь свою реализацию write, который пишет в буфер и фалшит по делиметеру

Alexey
24.08.2018
12:20:37
я в курсе, что в go есть generic типы - map, например
я не в курсе, зачем вам нужны генерики кроме тех, что уже есть
Немного некропостинга, но так уж получилось, что у это сообщение попалось мне на глаза.
Вот пример задачи в которой я страдаю без дженериков: отложенные вычисления. У меня есть пачка сервисов для которых нужно инициализировать клиенты. Эти клиенты это интерфейс с пачкой разных методов. Я бы хотел иметь возможность написать такой интерфейс, который будет возвращать типизированный ответ. Внутри это будет реализовано в виде значения, которое может быть nil. Если оно nil, то берем лок, и инициализирем. Сейчас у меня два варианта - либо копипастить, либо возвращать interface {}. Оба печальные.


Алексей
24.08.2018
12:21:26
у нас константы похуже - они бывают только базовых типов
У них вроде тоже только для примитивных типов константы по стандарту работают. Для того, чтобы массив или объект был immutable нужно его специальным образом зафризить, например так:
Object.freeze({a : 1})
Константы не позвоволяют значение менять, вы не можете своей константе присвоить новый объект, а вот его значениям - легко. Дабы этого избежать юзают фризинг, причем обычный работает поверхностно, т.е не для вложенных свойств объектов, поэтому нужно пилить велосипеды аля deepFreeze.

Denis
24.08.2018
12:22:54
а что будет, если попытаться поменять значение такого объекта? эксепшн в рантайме? или просто ничего?

Алексей
24.08.2018
12:22:55

Daniel
24.08.2018
12:23:02

Алексей
24.08.2018
12:23:47

Илья
24.08.2018
12:24:19

Tigran
24.08.2018
12:25:36

Илья
24.08.2018
12:26:02

Alexey
24.08.2018
12:26:08
почему не воспользоыаться кодогенерацией?
Воспользоваться можно, но очень хочется обойтись без нее. Я хочу иметь возможность видеть в PR весь код. Могу еще добавить субъективного - нужно всегда помнить что у тебя есть два типа кода - один который ты можешь менять, а другой который нет.

Tigran
24.08.2018
12:26:23