Anonymous
Как то так (писал с утюга, могут быть ошибки):
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 {
return nil, err
}
return c, nil
}
Anonymous
А почему ioutil.ReadAll(file) ?
Anonymous
Переписал код, вроде так должно быть.
Anonymous
Сначала считал файл в b, затем отконвертировал байты в структуру.
Anonymous
Ну это просто функция. Я через метод пробую.
Anonymous
Но выглядит хорошо.))
Anonymous
Обычно через функцию все делают. :)
Anonymous
Если хочешь через метод, то нужно указатель использовать (звёздочку поставить):
func (cnf *Config) Load() error
Slava
в виме крутой плагин
Anonymous
Anonymous
Коллеги, такой вопрос. Мне нужно в несколько потоков обработать массив. Что я не так делаю?
https://play.golang.org/p/Ez1Or17IYzn
Slava
переменная v создаётся только один раз
Slava
ты её используешь в каждом цикле
Anonymous
Slava
читай это как
Slava
var v
Slava
for v = range
Anonymous
Не-не-не, если убрать go func(), то всё работает, проблема не в range
Slava
ты замыкаешь v внутрь горутины
Slava
когда цикл прошёл
Slava
твоя замыкнутая переменная указывает на память с последним элементом
Anonymous
Тогда что мне сделать, чтобы передавалось в каждую горутину своё значение?
Slava
передавай как аргумент в функцию
Slava
или копируй внутри цикла
Anonymous
Slava
не за что
Slava
это не фишка го
Slava
то же самое и в js и вдругих языках
Slava
так работают замыкания =)
Slava
кажется js программистов любят на собеседованиях спрашивать подобные вещи
Slava
у нас тут как раз много nodejs набежало
Anonymous
Хех, я из Free Pascal'я, у нас вообще таких фишек нету 😄
Anonymous
Anonymous
Anonymous
Ребят подскажите как реализовать API чтобы отдавать mp3
То есть со стороны клиента есть нечто вот такое (player.add('http://path-to-mp3.com/example.mp3');)
Anonymous
Не совсем пойму как это реализовать на бэке, или просто отдавать ссылку на файл?
Zloy-Dobry
Просто ссылку
Zloy-Dobry
Как еще то
Anonymous
ясно спс
Anonymous
Как еще то
Да хз, раньше не сталкивался с подобной задачей, думал есть еще какие решения
Anonymous
Привет
Anonymous
Подскажите плз
Anonymous
package main
import (
"flag"
"fmt"
"log"
"x/ssh"
)
func main() {
pool := flag.String("p", "", "IP format 192.168.1.0/24")
flag.Parse()
hosts, err := ssh.GenerateHosts(*pool)
if err != nil {
log.Fatalf("[ERROR] %v\n", err)
}
jobs := make(chan string, len(hosts))
results := make(chan string, 3)
for w := 1; w <= 3; w++ {
go ssh.Scan(w, jobs, results)
}
for _, host := range hosts {
// fmt.Print(host + "\n")
jobs <- host
}
close(jobs)
for i := 0; i < len(hosts); i++ {
fmt.Print(<-results)
}
}
Anonymous
Почему то прозодит всего три итерации и ждет
А вот когда w < len(hosts)
Anonymous
проходит все итерации
Anonymous
Я так понимаю горутина живая и ждет сообщения в канале, но я вроде как сразу все jobs отдал
Anonymous
Там где ssh.Scan просто
for j := range jobs {}
Anonymous
По идее же должны все jobs пройтись в тех же трех горутинах, но что-то не так
Anonymous
В общем я хочу вот так
Anonymous
https://play.golang.org/p/FDaZZ_b4Ocd
Anonymous
Может быть какая то особенность реализации?
Anonymous
А вот так все работает
Anonymous
package main
import (
"flag"
"fmt"
"log"
"x/ssh"
)
func main() {
pool := flag.String("p", "", "IP format 192.168.1.0/24")
flag.Parse()
// 64.254.32.0/24
hosts, err := ssh.GenerateHosts(*pool)
if err != nil {
log.Fatalf("[ERROR] %v\n", err)
}
jobs := make(chan string, len(hosts))
results := make(chan string, 3)
for w := 0; w < len(hosts); w++ {
go ssh.Scan(w, jobs, results)
}
for _, host := range hosts {
// fmt.Print(host + "\n")
jobs <- host
}
close(jobs)
for i := 0; i < len(hosts); i++ {
fmt.Print(<-results)
}
}
Anonymous
Но я хочу сделать не 254 воркера(w := 0; w < len(hosts); w++), а всего 10
Alexander
Вместо подсчета количества результатов в канале лучше использовать WaitGroup
Anonymous
Alexander
Про последние три строчки
Мерль
Anonymous
Alexander
Я думаю, просто некоторые хосты вернули ошибку и горутина не записала ответ в канал. Поэтому количество не сходится
Anonymous
Anonymous
results <- fmt.Sprintf("Thread %d: %v\n", thread, err)
Anonymous
Anonymous
Она возвращает 3 результата и на этом просто стоит прога
Anonymous
Ничего не делая, при этом не выходит
Anonymous
for w := 0; w < len(hosts); w++ тут я имею ввиду
Alexander
Аа, ну правильно!
Anonymous
Объясни, пожалуйста, с чем связано, я хоть пойму)
Alexander
Горутина же не читает из канала циклически
Alexander
Каждая обрабатывает только одну задачу
Anonymous
то есть если я это упакую в for{}, то сработает?
Alexander
Погоди, гляну доку на x/ssh
Anonymous
Не над
Alexander
Хм, а что за пакет такой вообще? Есть x/crypto/ssh
Anonymous
Я руками сам
Anonymous
Без пакета
Nikita
close(jobs) никогда не выполнится