Pawel
а как в аля питоне append
не глуми голову. создай новый тип B включающий твой исходный A type B struct{ A ... // здесь твой блэкджек и шлюхи } и верни его из функции
Oleksandr
подскажите пожалуйста. Задача: вычитать конфиг из файла при инициализации приложения и юзать его в разных местах. Как это лучше сделать? глобальные переменные или передавать как аргумент везде, где он юзается?
Oleksandr
за глобальные пишут, что это зло и надо избегать.
Oleksandr
+ попробовал так, но она (глобальная переменная) не везде видна
Ivan
Херня это.
ой хз, хз
Alexander
Главное, не пытаться в него писать после запуска приложения. А то на race condition можно налететь
Oleksandr
не. я прочитаю раз и все
🎉
ой хз, хз
есть експириенс(не у меня) они овердокуя чего в памяти держат... тупо так быстрее отдавать...
Oleksandr
хорошо. теперь что я делаю не так. var cnf util.ReaderConfig func main() { cnf, err := getReaderConfiguration() fmt.Println(cnf) ....... }
Oleksandr
тут нормально. есть значение.
Mikhail
Хочу скачать файл. Делаю так: https://play.golang.org/p/SrBZo5HC8yR И что то не то получается.
Oleksandr
дальше по коду в другой функции (в этом же main.go файле) func processFile(fileName string, category util.Category) { fmt.Println(cnf) platformConfig, err := util.ParseClickhouseConfigFile(cnf.PlatformConfigDir + category.Name + ".yml")
Oleksandr
не видит. Пустая структура
🎉
не. я прочитаю раз и все
// Config struct for ... type Config struct { ... ListenLocal string `json:"listenlocal"` DatabaseNameAndPath string `json:"databasenameandpath"` } // LoadConfig load configuration from file func LoadConfig() (c *Config, err error) { b, err := ioutil.ReadFile("config.json") if err != nil { return nil, err } err = json.Unmarshal(b, &c) if err != nil { log.Fatal(err) return nil, err } return c, nil } Ну и сам конфиг config.json { "...": "", "...": "" }
🎉
А, что-бы везде видно было глобальную переменную воткни var conf *Config терь можешь так юзать err = InitDB(conf.DatabaseNameAndPath)
Oleksandr
var globalConfig util.ReaderConfig func main() { tmpConfig, err := getReaderConfiguration() fmt.Println(cnf1) globalConfig = tmpConfig } О. так видно ее везде
Mikhail
Хочу скачать файл. Делаю так: https://play.golang.org/p/SrBZo5HC8yR И что то не то получается.
first path segment in URL cannot contain colon. Какое двоеточие ему не нравится в "https://dl.google.com/go/go1.10.linux-amd64.tar.gz"?
Alexander
> cnf, err := getReaderConfiguration() Эта строчка создаёт новую переменную cnf
Alexander
var globalConfig util.ReaderConfig func main() { tmpConfig, err := getReaderConfiguration() fmt.Println(cnf1) globalConfig = tmpConfig } О. так видно ее везде
Можно просто переменную err сначала декларировать и потом вместо := использовать = > cnf, err = getReaderConfiguration()
Mikhail
Ну я как кэп могу сказать что двоеточие тут одно))
Я убирал часть https: из url и не очень то помогло
Anonymous
Я убирал часть https: из url и не очень то помогло
У меня твой код работает и качает
Anonymous
Что делает CheckErr?
Mikhail
У меня твой код работает и качает
url строка которую регуляркой тащу с сайта голанга
Mikhail
но юникод же везде..
Mikhail
что еще может не так пойти
Anonymous
Mikhail
Показывай код вытаскивания URL
https://play.golang.org/p/Jw4Z4eSoGmR
Mikhail
golangURL = "https://golang.org/dl/"
Anonymous
https://play.golang.org/p/Jw4Z4eSoGmR
Первое, что бросилось в глаза. ChechErr не делает return, из-за чего в случае ошибки программа продолжит выполнять дичь.
Anonymous
ааа ок
Anonymous
https://play.golang.org/p/Jw4Z4eSoGmR
У тебя регулярка захватывает кавычки. Думаю, это очепятка при замене " на `?
Alexander
Скобки то внутри кавычек стоят
Mikhail
Скобки то внутри кавычек стоят
но действительно захватывало
Alexander
Хотя, тогда, наверное, надо rg.FindAll(a, 1)[0] заменить на rg.FindAll(a, 1)[1]
Alexander
не, я гоню. Ignore me
Anonymous
Хотя, тогда, наверное, надо rg.FindAll(a, 1)[0] заменить на rg.FindAll(a, 1)[1]
На просто Find тогда - ему вроде как нужно первое попадание ))
Anonymous
Или даже сразу FindString
Sergey
Ребят, можете для дилетанта объяснить, вот я использую для логирования стандартные возможности, либо фреймворки, в консоль то все пишет прекрасно, а если сервер упадёт где это смотреть? Или нужно как то это в файл писать или где то можно прочитать просто так?
Anonymous
вот такое еще. адоны на ноду на го писать можно?
тебе нельзя пока веру не примишь...
Lev
если nohup, то в nohup.out :troll:
Alexander
В мире докера и Kubernettes вообще уже повсеместно принято лог писать в stdout/stderr
🎉
Хелп, свежий взгляд нужен. type MySityWeather struct { TempC float64 `json:"tempc"` SityWeather string `json:"sityweather"` } var m MySityWeather func weather() error { ... m.TempC = r.CurrentObservation.TempC m.SityWeather = r.CurrentObservation.Weather } main(){ go weather() fmt.Pprintf("Погода %2.f°С %s\n", m.TempC, m.SityWeather) } В функ main по нулям, ЧЯДНТ?
Alexander
Sity 🤦
Eugene
не вызываешь weather()?
🎉
не вызываешь weather()?
Вызываю, в горутине.
🎉
var m *MySityWeather звёздочку поставить?
Пробовал, панику ловлю. Щас запробую ещё раз.
Eugene
указатель только инициализируй сначала, что бы паники не было
Alexander
Горутина то не выполняется к моменту вызова Pprintf
Alexander
Надо ждать её завершения
🎉
Горутина то не выполняется к моменту вызова Pprintf
Там цикл внутри for { m.TempC = r.CurrentObservation.TempC m.SityWeather = r.CurrentObservation.Weather time.Sleep(3 * time.Minute) }
Alexander
Где? Я вижу что горутина стартует, потом сразу выполняется принт и программа завершается. Горутина прибивается при этрм
Eugene
я го изучаю первый день, но с горутинами как мне кажется надо таки как-то синхронизироваться
Eugene
по крайней мере в шарпе есть await для этого
Alexander
Просто убери go перед weather для начала
🎉
Просто убери go перед weather для начала
А смысл? Нужно что-бы горутина периодически лазила за погодой, тот же самый вариант у мну работает с курсами валют.
🎉
Только там через мапу передаю, а тут через структуру.
Alexander
Через 10 минут отвечу, если кто-то другой не поможет. Занят немного сейчас
Eugene
http://goinbigdata.com/golang-wait-for-all-goroutines-to-finish/
🎉
Ок, пойду с указателем помудрю.
Eugene
если кратко - надо сделать канал и в горутине в него писать, в основном потоке - ждать написаного
Eugene
когда прочитал - можешь быть уверен что работа выполнена
Eugene
go func не прерывает основного потока
🎉
если кратко - надо сделать канал и в горутине в него писать, в основном потоке - ждать написаного
Я бы так и сделал, только смысла мало. Есть две горутинки, одна лазиет за курсами валют и и кидает их в мапу, оттуда я достаю их где угодно в коде. И это работает. Вот со структуркой какая-то трабла, она пустая.
Eugene
ну смотри, проблема в чем, ты вызываешь горутину, но это не вызов функции, это указание шедулеру запустить эту функцию когда нибудь, когда будет свободный поток для этого
🎉
извени но я не понял в weather() откуда r ?
Это из другой структуры. Я просто показал как инизиализируется структура основная.
Evgeniy
а как она оживает?
Eugene
короче сделай поле go weather сразу слип на пять секунд и думаю ты увидишь значение