
Ruslan
20.01.2018
22:38:58


Marlik
20.01.2018
22:38:58
Коллеги, кто как, свои приложения в продакшен заводит?
Не сказать что это продакшен, пишу для себя любимого, но рабочая схема у меня на данный момент такая. Захожу на сервер,
mkdir project
cd project
git init
git add .
git commit -m "first commit"
Теперь создадим отдельную ветку production
git checkout -b production
На домашнем ПК
git clone ssh://user@8.8.8.8/home/project
Я могу такое позволить потому что я заранее сделал ключи для ssh. На сервере, переключаемся на master
git checkout master
Теперь, нужно создать скрипт, который при пуше смержит production с master
и перезапустит мой проект
cd project
touch .git/hooks/post-receive
nano .git/hooks/post-receive
Вставляем туда
#!/bin/sh
cd ..
env -i git merge production
sudo systemctl stop app
sudo systemctl start app
Разумеется у нас есть конфиг systemd - /etc/systemd/system/app.service, через него происходит стоп и старт проекта. Как-то так.

Max
20.01.2018
22:41:53
Вопрос стоял почему бы его не убрать?

Google

Max
20.01.2018
22:42:54
Если одни приимущества на стороне этого варианта. Может кто то может привести реальные юзеркейсы?

Ruslan
20.01.2018
22:45:03
Я не знаю. Я не академик, я просто делаю сайты и изучаю новое. Задайте вопрос создателям Го.

Roman
20.01.2018
22:48:54

Max
20.01.2018
22:52:45
Единообразие, кмк
Ну если что я 10 лет программирую на всевозможных языках и даже писал на такой экзотике как Uno, а то, что здесь много неофитов именно на Go, то это логично, первая версия всего 6 лет назад релизнулась, а популярность стал набирать только года 3-4 назад.

Ruslan
20.01.2018
22:53:21
Вопрос стоял почему бы его не убрать?
Я рад, что вы изучаете Го так досконально.
Фразой - "Я не знаю. Я не академик, я просто делаю сайты и изучаю новое. Задайте вопрос создателям Го." я не хотел вас обидеть. Пошу прошения
*Прошу прощения

Alexander
20.01.2018
23:14:48
It is intended that programs written to the Go 1 specification will continue to compile and run correctly, unchanged, over the lifetime of that specification. At some indefinite point, a Go 2 specification may arise, but until that time, Go programs that work today should continue to work even as future "point" releases of Go 1 arise (Go 1.1, Go 1.2, etc.).
https://golang.org/doc/go1compat


Max
20.01.2018
23:17:35
Второй философский вопрос:
Зачем нужны указатели в Go без арифметики указателей (понятное дело из-за GC)? Если нужно передать объект именно по ссылке, то используем именно ссылку или вообще все это дело делаем неявно и оставляем на волю компилятора как в других языках. А указатели без арифметики не имеют смысла имхо.
Только потому что так верно:
func (self *Foo) Set(x int) { self.val = x }
А так компилятор не позволяет - не довод:
func (self &Foo) Set(x int) { self.val = x }
Скорее всего это тоже вопрос к авторам компилятора


Vladislav
20.01.2018
23:37:12

Alexander
20.01.2018
23:37:16

Google

Vladislav
20.01.2018
23:37:19
Это про одно и тоже.

Alexander
20.01.2018
23:39:05
В Go структуры часто передаются в функции по указателю, чтобы избежать копирования (структура может быть довольно "тяжелой").

Max
20.01.2018
23:39:37

Vladislav
20.01.2018
23:41:04
Это тип, означающий указатель на тип.

Alexander
20.01.2018
23:41:19
В С есть указатели и ссылки. В Го только указатели
(кстати, понимание указателей и ссылок, а также их отличие - это часто большая проблема для изучающих С/С++)

Max
20.01.2018
23:42:06
Например в C++:
void set(Foo* x) {
x->val = 1;
}
Или
void set(Foo& x) {
x.val = 1;
}

Phil
20.01.2018
23:43:11

Max
20.01.2018
23:43:23
В C++
В C да, их нету, только указатели

Phil
20.01.2018
23:44:54
А вру. Я так понимаю в Питоне ссылки как раз

Alexander
20.01.2018
23:45:18
Да, я забыл. Давно на С ничего не писал. Ну так вот, в Го, можно считать, нет указателей, а есть только аналог ссылок из С++
приблизительный

Phil
20.01.2018
23:46:12
В Go как раз чисто указатели

Max
20.01.2018
23:46:35

Roman
20.01.2018
23:46:53

Phil
20.01.2018
23:47:49

Max
20.01.2018
23:48:03
Все компиляторы у которых есть сборщик муссора оперируют исключительно с ссылками и запрещают манипуляции с указателями, оно и понятно

Google

Max
20.01.2018
23:48:20
Но в Go тоже GC, а не скажем ARC

Alexander
20.01.2018
23:48:41
да даже не важно, как именно они реализованы. Я к тому, что работают они похоже на ссылки в С++. Указывают на переменную, арифметики нет, нужны для передачи изменяемых параметров в функции

Phil
20.01.2018
23:49:42

Max
20.01.2018
23:50:02

Phil
20.01.2018
23:50:46
Я более чем уверен, что арифметика есть

Alexander
20.01.2018
23:51:01
А в чем смысл вопроса тогда? Почему назвали указателем, а не ссылкой? Потому что под капотом указатель.

Max
20.01.2018
23:51:17
Правда в C# для этого используют ref и out, но там просто ссылки неявные

Alexander
20.01.2018
23:51:25
Арифметика, вроде бы, есть в unsafe

Phil
20.01.2018
23:51:40

Alexander
20.01.2018
23:51:47
но лучше туда не лезть :)

Phil
20.01.2018
23:51:55

Max
20.01.2018
23:52:07
Ага, значит все таки в unsafe есть

Phil
20.01.2018
23:52:16

Max
20.01.2018
23:52:34
Как кстати с маршаллингом у Go? Еще до этого не дошол

Alexander
20.01.2018
23:53:09
https://golang.org/pkg/unsafe/ - см. type Pointer

Phil
20.01.2018
23:54:23
Надо кстати перейти со своего коронного "четверть века Golang" на "а как Go написан на Go?". Это ведь очень интересный вопрос

Alexander
20.01.2018
23:55:29
А что там про четверть века?

Phil
20.01.2018
23:56:07

Google

Alexander
20.01.2018
23:56:29
э-э-э-э

Phil
20.01.2018
23:56:43
ААААААААААААААААААААААААААААААААААААААА!!!!!!!!!!!!!!!!!!!

Alexander
20.01.2018
23:56:58
я ньюфаг. Расскажи

Max
20.01.2018
23:58:28
Ты хочешь поведать про Go! ?
Если да, то это тоже самое что говорить, что JavaScript унаследовался от Java

Phil
21.01.2018
00:00:02
Это игрушка Пайка. Любимая игрушка Пайка. Не им написанная, о он влюбился в неё с первого взгляда с первого релиза в 1992 году, в котором он и участвовал сам. Были ещё там ветки, ещё что, но в итоге это стало его игрушкой на всю жизнь. Это язык Alef. С сильно переделанным рантаймом (с учетом того что не взлетел). Есть только две вещи, почему нельзя провести прямую линию - копирастия, google не может впрямую пиарить эту историю, и программы на Alef не будут компилиться на Go и наоборот - полная несовместимость
Я надеюсь, вы не думаете, что Go действительно кто-то портировал на Plan9? :)) Нет, просто наработки и уши Plan9 там вычистили чуть не к 1.5 только
Давно не смотрел - Go до сих пор точки с запятыми препроцессором расставляет?

Max
21.01.2018
00:02:14
А ну, так у Алефа он унаследовал только многопоточность и каналы

Phil
21.01.2018
00:02:28
Это просто он и есть

Max
21.01.2018
00:03:55
Да Alef даже пофункциональнее выглядит:
http://doc.cat-v.org/plan_9/2nd_edition/papers/alef/ref

Phil
21.01.2018
00:04:27
Да. Если почитать артикли того же Пайка или там Ритчи тех лет - там понятно почему
Они там с Alef собственно зашились на работе с памятью. А с GC они не смогли придумать как реализовать часть функционала

Alexander
21.01.2018
00:06:51
Любопытно, да. Посмотрел сейчас на этот Alef - да, есть много параллелей с Go. Странно, что я про него ни разу раньше не слышал

Phil
21.01.2018
00:07:07
Я на самом деле не к тому, что надо называть Go Alef'ом или там значки вешать и памятники ставить. Я только к тому, что надо понимать, что история этого языка совершенно откровенно не начинается в 2007 году. И нет, это не то чтобы "с него взяли". Это одна и та же команда разработчиков с одной и той же платформой.
Например при вое про дженерики надо помнить, что разработчики Go знали о дженериках, когда большинство нытиков ходило разве что в подгузники, а их любимого языка (Java) ещё не было в природе.
И использование дженериков с каналами - это не теория, а вполне себе практика. Разработчикам явно не понравившаяся

Google

Phil
21.01.2018
00:11:20
И синтаксис кстати придумывать не надо - он есть :))))))

Max
21.01.2018
00:17:22
Кстати Алеф еще получил развитие в виде Limbo
А Go и не скрывают, что одним из вдохновителей был как раз Limbo. Так что между Go и Алефом есть родственная связь, не пойму почему Google что то там отрицает

Phil
21.01.2018
00:19:22

Max
21.01.2018
00:21:20
Сказал бы:
https://www.ibm.com/developerworks/ru/library/l-inferno_plan9_3/index.html
Те же срезы, короткая запись для объявления переменных, туплеты, каналы и т д

Phil
21.01.2018
00:24:33

Max
21.01.2018
00:27:12
А еще он поддерживает ARC с фоллбэком на GC для циклических указателей. Впервые такое вижу

Marlik
21.01.2018
02:56:09
Код
type Config struct {
Name string `json:"name"`
}
func GetFromConfig() string {
file, err := os.Open("./config.json")
if err != nil {
log.Fatal(err)
}
defer file.Close()
decoder := json.NewDecoder(file)
cnf := Config{}
err = decoder.Decode(&cnf)
if err != nil {
log.Panic(err)
}
return cnf.Name
}
Вопрос, как бы мне так извернуться что-бы через GetFromConfig() получать аргумент, и возвращать его?
func GetFromConfig(s string) string {
...
return cnf.s
Как-то так. Или если есть какие получше варианты?

Andrew
21.01.2018
03:25:47

Marlik
21.01.2018
03:26:14
Это запускается один раз при старте.
Получаю буквально три-четыре параметра из конфига.

Andrew
21.01.2018
03:28:50
Ок, второй вариант:
func (config *MyConfig) GetName() string {
return config.Name}
Я бы завёл под конфиг свой тип, и для него бы реализовал методы, возвращающие нужные поля.

Marlik
21.01.2018
03:30:58
В том то и дело, что поля у структуры одинаковые, строка. То есть не вижу смысла писать кучу методов.

Andrew
21.01.2018
03:31:48
Хотя мне есть что предложить. Если конфиг без вложенностей, можешь через reflect доставать нужное поле:
func (c Config) GetField(fieldName string) string() {}
Но никто это не одобрит ))

Marlik
21.01.2018
03:33:15
Да при чём тут дженерики? Мне просто нужна функция, одна, которая распарсит джейсон и вернёт запрашиваемую строку из файла.

Andrew
21.01.2018
03:34:34