Valentin
*[]T это хуерага
Мерль
@m0sth8 а ваш фреймворк не вышел ещё на гитхабе?
Valentin
Anton
*[]T это хуерага
отлично. Мне товарищу так и передать?))) Думаю, он скжет что не аргументированно как-то
Valentin
Anonymous
Slava
Илья
Мерль
какой?
Вебфреймворк на кодогенерации
Oleg
engelbart
Погодите погодите т.е. *[]T нах не надо?
engelbart
и []*T тоже?
Valentin
А нахуя?
Илья
[]*T это вагон г на хипе
Oleg
engelbart
Я тоже делал
Anton
для []T и *[]T можно вернуть из функции nil
Илья
т.е. слайс с nil вместо элемента
Илья
тогда *T осмысленно
Мерль
Кажется, сегодня будет #подкаст
Anton
так. еще из простых вопросов. Есть функция, которая должна пройтись по слайсу в режиме чтения и вернуть другой слайс. Сейчас это описано так
func test(arr *[]Test) []Test
. Нужен ли * ?
Valentin
нет
Anton
вернее написано func test(arr *[]Test) *[]Test, но тут уже сказали, что *[]Test на выходе - зашквар
Anonymous
Нет, обе звезды не требуются
Valentin
наконец я дома, настало время открывать IDE
Oleg
Valentin
вроде уже идет, мне приходил какой то пуш из слака
Anton
если передаем слайс в режиме "почитать", то он все равно передастся по ссылке и можно без *. Копирования элементиков в функцию не будет. Пральн?
John
Ребята, не подскажете, каким образом проще всего получать вывод из tcpdump в golang? пытался сделать таким способом...
John
package main
import (
"bufio"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("tcpdump", "-l -ilo -nXs0 udp and port 4729")
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
if err := cmd.Start(); err != nil {
panic(err)
}
in := bufio.NewScanner(stdout)
for in.Scan() {
log.Printf(in.Text())
}
if err := in.Err(); err != nil {
log.Printf("error: %s", err)
}
}
John
но программа завершается без единой строчки вывода
Oleg
John
в чем я могу ошибаться?
Мерль
Anton
Oleg
John
cmd.Wait()?
если я не ошибаюсь, то это приведет к тому, что программа будет ждать окончания завершения вывода?
John
или как аз наоборот?
Valentin
Так открой ее код :)
Anton
За простые вопросики извиняйте, изучаю го по gobyexample, а там ничего путного не пишут
John
тоже молчит, уже пробовал
John
а в каком месте лучше поставить cmd.Wait()?
Anton
А просто cmd.Output() работает? 🤔
John
просто уже голова плавится от этой херни
John
ну так вот
engelbart
engelbart
не, у меня не тока это задача
engelbart
у меня main там норм работает
engelbart
но вот хочу cmd команду с ограничением по времени
engelbart
я знаю у http есть context
engelbart
а тут?
Igor
select по каналам + timer
Slava
у cmd тоже есть контекст
Slava
https://golang.org/pkg/os/exec/#CommandContext
engelbart
Ох
Anton
новая порция базовых вопросов. Почему тру го вэй возвращать *Т заместо Т? И почему зашкварно возвращать *[]T заместо []Т?
nikita
Ну массив это и так указатель
nikita
А указать на структуру меньше занимает памяти, потом проще дальше передавать, без аллокаций
Quet
да никакое это не тру всегда возвращать указатель
Slava
*Type возвращется для того, чтобы иметь возможно возвращать null, [] и map[] сами по себе указатели и могут быть null
Евгений
новая порция базовых вопросов. Почему тру го вэй возвращать *Т заместо Т? И почему зашкварно возвращать *[]T заместо []Т?
Если я верно понимаю:
*[]T - это указатель на слайс, который внутри себя указывает на массив Т, и итоге у вас указатель на указатель. Чрезмерно сложная структура.
[]T - это слайс, который внутри себя указывает на массив T. Логично и удобно, быстро передается в виде одного короткого указателя.
Другое дело, если вы хотели вернуть
*[...]T (к соалению, именно так вернуть не получится - нужно явно указать длину массива) - указатель на массив Т. Оно как бы логично, и указатель всего 1. Но проблема в том, что указатель на массив - это такой слайс на педальном приводе. Работать с массивом менее удобно, чем со слайсом, например, у массива фиксированая длина. То есть [2]T и [3]T - это уже разные типы. Нужно будет их как-то приводить, учитывать длину и прочее.
[...]T - это куча копирований и опять все неудобства массива.
Anton
ну в принципе я понял что к чему. спасибо всем
Anton
если нужно передать слайс структур в функцию, которая может некоторые поля структур менять, то лучше писать
func test(arr *[]T)
или
func test(arr []*T)
. Я склоняюсь ко 2 варианту, с 1ым слишком дурно получается.
Евгений
можно сразу func test(arr []T)]
Евгений
https://play.golang.org/p/BOHsN4E_qh
Vladimir
Vladimir
пока ты не собираешься расширять слайс
Евгений
лучше дае https://play.golang.org/p/aVPCB9Y9Wu https://play.golang.org/p/aVPCB9Y9Wu
Vladimir
@hellb0ys в Го слайс это структура, где есть len, capacity и указатель на данные
Vladimir
при передаче у тебя скопируется все 3 момента
Vladimir
но так как на данные указатель - то ты при обращении к arr[0] будешь иметь доступ к реальными данными