Alexander
я ньюфаг. Расскажи
Anonymous
Ты хочешь поведать про Go! ?
Anonymous
Если да, то это тоже самое что говорить, что JavaScript унаследовался от Java
🏳️ Phil
Это игрушка Пайка. Любимая игрушка Пайка. Не им написанная, о он влюбился в неё с первого взгляда с первого релиза в 1992 году, в котором он и участвовал сам. Были ещё там ветки, ещё что, но в итоге это стало его игрушкой на всю жизнь. Это язык Alef. С сильно переделанным рантаймом (с учетом того что не взлетел). Есть только две вещи, почему нельзя провести прямую линию - копирастия, google не может впрямую пиарить эту историю, и программы на Alef не будут компилиться на Go и наоборот - полная несовместимость
🏳️ Phil
🏳️ Phil
Я надеюсь, вы не думаете, что Go действительно кто-то портировал на Plan9? :)) Нет, просто наработки и уши Plan9 там вычистили чуть не к 1.5 только
🏳️ Phil
Давно не смотрел - Go до сих пор точки с запятыми препроцессором расставляет?
Anonymous
А ну, так у Алефа он унаследовал только многопоточность и каналы
🏳️ Phil
🏳️ Phil
Это просто он и есть
Anonymous
Да Alef даже пофункциональнее выглядит:
http://doc.cat-v.org/plan_9/2nd_edition/papers/alef/ref
🏳️ Phil
Да. Если почитать артикли того же Пайка или там Ритчи тех лет - там понятно почему
🏳️ Phil
Они там с Alef собственно зашились на работе с памятью. А с GC они не смогли придумать как реализовать часть функционала
Alexander
Любопытно, да. Посмотрел сейчас на этот Alef - да, есть много параллелей с Go. Странно, что я про него ни разу раньше не слышал
🏳️ Phil
Я на самом деле не к тому, что надо называть Go Alef'ом или там значки вешать и памятники ставить. Я только к тому, что надо понимать, что история этого языка совершенно откровенно не начинается в 2007 году. И нет, это не то чтобы "с него взяли". Это одна и та же команда разработчиков с одной и той же платформой.
🏳️ Phil
🏳️ Phil
Например при вое про дженерики надо помнить, что разработчики Go знали о дженериках, когда большинство нытиков ходило разве что в подгузники, а их любимого языка (Java) ещё не было в природе.
🏳️ Phil
И использование дженериков с каналами - это не теория, а вполне себе практика. Разработчикам явно не понравившаяся
🏳️ Phil
И синтаксис кстати придумывать не надо - он есть :))))))
Anonymous
Кстати Алеф еще получил развитие в виде Limbo
Anonymous
А Go и не скрывают, что одним из вдохновителей был как раз Limbo. Так что между Go и Алефом есть родственная связь, не пойму почему Google что то там отрицает
🏳️ Phil
🏳️ Phil
Anonymous
Сказал бы:
https://www.ibm.com/developerworks/ru/library/l-inferno_plan9_3/index.html
Anonymous
Те же срезы, короткая запись для объявления переменных, туплеты, каналы и т д
Anonymous
А еще он поддерживает ARC с фоллбэком на GC для циклических указателей. Впервые такое вижу
Anonymous
Код
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
Как-то так. Или если есть какие получше варианты?
Anonymous
Anonymous
Anonymous
Это запускается один раз при старте.
Anonymous
Получаю буквально три-четыре параметра из конфига.
Anonymous
Ок, второй вариант:
func (config *MyConfig) GetName() string {
return config.Name}
Я бы завёл под конфиг свой тип, и для него бы реализовал методы, возвращающие нужные поля.
Anonymous
В том то и дело, что поля у структуры одинаковые, строка. То есть не вижу смысла писать кучу методов.
Anonymous
Anonymous
Хотя мне есть что предложить. Если конфиг без вложенностей, можешь через reflect доставать нужное поле:
func (c Config) GetField(fieldName string) string() {}
Anonymous
Но никто это не одобрит ))
Anonymous
Да при чём тут дженерики? Мне просто нужна функция, одна, которая распарсит джейсон и вернёт запрашиваемую строку из файла.
Anonymous
Anonymous
Но если прям такое желание брать из json, смотри пример в этой либе:
github.com/buger/jsonparser
Anonymous
Так-то уже есть чем распарсить.
decoder := json.NewDecoder(file)
cnf := Config{}
err = decoder.Decode(&cnf)
Не улавливаю момент как мне подставить аргумент в return cnf.s (s это аргумент) . Пойду доку почитаю.
Anonymous
Anonymous
Anonymous
Slava
а ещё лучше, читать конфиг один раз при инициализации где-нибудь в main и пробрасывать внутрь
Anonymous
Ну это связано с хотелкой, не зашивать в код некоторые вещи. Например пишу бота, в config.json положил токен бота. Так как, токен может иногда меняться, то вот через внешний конфиг менять.
Anonymous
Anonymous
Anonymous
Да.
Тогда
> токен может иногда меняться
неверно.
Anonymous
Также например для конфигурации, сейчас один IP, завтра другой, сейчас например через nginx ловит, завтра сам слушает порт.
Anonymous
Anonymous
Поэтому внешний конфиг важен.
Slava
может проще перезапустить приложение?
Slava
ну или так, на SIGUSR
Anonymous
Потому, что считывать каждый раз переменные из конфига на диске - это бред.
Alexander
Вот так просыпаешься в 8 утра в воскресенье, а в чатике такая оживлённая дискуссия. Спасибо, парни! :)) То что надо под утренний чаёк :)
Anonymous
Anonymous
Anonymous
Anonymous
Anonymous
Anonymous
Anonymous
Да.
Если пользователь меняет конфиг, он либо перезапускает приложение, либо вызывает ReloadConfig()
Anonymous
Что-бы понятнее было, вот начало бота:
func main() {
conf := Config{}
bot, err := tgbotapi.NewBotAPI(conf.Config().TelegramBotToken)
if err != nil {
log.Fatal(err)
}
_, err = bot.SetWebhook(tgbotapi.NewWebhookWithCert(conf.Config().WebhooksURL+bot.Token, "public.pem"))
if err != nil {
log.Fatal(err)
}
updates := bot.ListenForWebhook("/" + bot.Token)
go http.ListenAndServe(conf.Config().ListenLocal, nil)
...
Тут дальше ловим апдейты.
Anonymous
Anonymous
Я ожидал увидеть такое:
func main() {
conf := LoadConfig() // считываем конфиг из файла
bot, err := tgbotapi.NewBotAPI(conf.TelegramBotToken)
}
Anonymous
conf.Config().TelegramBotToken что за метод Config()?
Anonymous
Anonymous
Anonymous
conf.Config().TelegramBotToken что за метод Config()?
func (cnf Config) Config() string {
file, err := os.Open("./config.json")
if err != nil {
log.Fatal(err)
}
defer file.Close()
decoder := json.NewDecoder(file)
err = decoder.Decode(&cnf)
if err != nil {
log.Panic(err)
}
return cnf
}
Anonymous
Пока не соображу как))
Функция загрузка должна выглядеть так:
func LoadConfig() (c *Config, err error)
Anonymous