Anonymous
export GOPATH=$PWD:$PWD/vendor не помог?
Чуть позже попробую и отпишусь, только вопрос - что за PWD?
Roman
Текущая папка
Roman
Вернее полный путь
Anonymous
И ещё вопрос - создал тестовый проект, пробую его скомпилить с помощью gb build all и просто gb build, вроде всё проходит, но где сам-то бинарник?
Anonymous
В самой папке проекта не создаётся папка bin
Anonymous
Где запустил go build, в том же каталоге и бинарник
Я запускал в самом пакете (src/mypackage) и просто в папке проекта, но нигде нет этого бинарника
Anonymous
Не нашёл в истории что такое gb...
Artem
чет у меня голова не соображает сегодня. нужно переставить последний элемент слайса в начало, есть какой то канонический способ? то, что у меня получилось чет даже самого пугает. func swap(s *[]int) { l := len((*s)) - 1 (*s) = append([]int{(*s)[l]}, (*s)[:l]...) }
Aleksey
s = append([]int{s[len(s)-1:len(s)-1]}, s[1:len(s)-2]...)
Artem
s = append([]int{s[len(s)-1:len(s)-1]}, s[1:len(s)-2]...)
чет я это не понял. оно вообще может работать?
Artem
это тоже фигня
Aleksey
Незнаю :) ща проверим
Artem
во первых длина динамическая
Artem
во вторых тут s[1:len(s)-2] почему то пропускается первый элемент и предпоследний или я че то не догоняю
Artem
а тут s[len(s)-1:len(s)-1] срез не нужен, s[len(s)-1] это уже последний элемент. вот к нему нужно приапендить s[:len(s)-1], последний же не включается, но суть я понял, наверно никак иначе...
Alexander
а чем s[0], s[len - 1] = s[len - 1], s[0] не угодило?
Aleksey
s = append(s[len(s)-1 : ], s[:len(s)-1]...)
Aleksey
Ну и то что я последнее кинул работает
Artem
s = append(s[len(s)-1 : ], s[:len(s)-1]...)
кстати да там же в первом срез возвращается, так будет куда лучше
Artem
а чем s[0], s[len - 1] = s[len - 1], s[0] не угодило?
и что по вашему это изменит значения s[0] и s[-1] в оригинальном слайсе?
Aleksey
https://play.golang.org/p/ATPecxcjpAP
Artem
https://play.golang.org/p/JcNeehrKwbu
вы выполните первый пример и посмотрите что он делает, перывй элемент должен сместиться с 0 на 1, последний идет в начало, а порядок остальных сохраняется
Alexander
ну ок, тогда вам сюда https://play.golang.org/p/ATPecxcjpAP
Artem
ну ок, тогда вам сюда https://play.golang.org/p/ATPecxcjpAP
да вот только чтобы сделать это в ф-ии и придется использовать передачу по ссылке и разыменовывание, разве что от конструкции []int{(*s)[l]} можно избавиться, что собственно тоже не мало.
Artem
в общем если кто знает способ лучше, https://play.golang.org/p/WQ-nBHyBEKp -делитесь :)
Anonymous
Для l не выделять память
И сделать код нечитаемым ))
Artem
Для l не выделять память
тогда придется ее дважды вызывать как минимум и продублировать хрень которую итак читать нереально
Aleksey
Что ж тут не читаемого? (*s) = append((*s)[len((*s)) - 1:], (*s)[:len((*s)) - 1]...)
Aleksey
Можно: (*s) = append((*s)[ (len((*s))-1) : ], (*s)[ : (len((*s))-1) ]...)
Zloy-Dobry
Пиздец
Zloy-Dobry
Что вы тут устроли?!
Zloy-Dobry
(*s) = это зачем так? Что это значит?
Artem
Можно: (*s) = append((*s)[ (len((*s))-1) : ], (*s)[ : (len((*s))-1) ]...)
еще пару скобок и получится lisp ))
Artem
(*s) = это зачем так? Что это значит?
знаете другой способ ?))))
Artem
это называется разыменовывание указателя.. точнее я так называю и за это его принимаю, а как на самом деле хз )
Aleksey
еще пару скобок и получится lisp ))
Это не я первый начал ))
Artem
(*s) = это зачем так? Что это значит?
слайс в ф-ию передается по &, и если указать тип, как *[]int, индексация будет недоступна
Aleksey
Я бы вообще сделал свой тип слайс и метод у него
Zver
А я бы вообще сдвигал все элементы. Все равно приходится копировать слайс полностью.
Zver
Не будет тогда выделения памяти.
Artem
Я бы вообще сделал свой тип слайс и метод у него
можно, но это не особо суть меняет, просто будет slice.swap(el1, el2) вызов усложнится. Точнее будет slice.swap(element), вот если указывать 2 элемента для свопа тогда да наверно через метод лучше
Artem
А я бы вообще сдвигал все элементы. Все равно приходится копировать слайс полностью.
я думал сначала о сдвиге, но память это одно, да и если там слайс на пару миллионов, а увеличение размера удваивает его, еще не известно что лучше. Но наверно нужно будет потестировать
Artem
хотя все равно все элементы перебираются. может сразу пустое место зарезервировать и все
Zver
я думал сначала о сдвиге, но память это одно, да и если там слайс на пару миллионов, а увеличение размера удваивает его, еще не известно что лучше. Но наверно нужно будет потестировать
Но когда вы делаете append все равно происходит копирование всего слайса. Единственное копирование может быть более оптимизированным в append. А так, да, запустите тест, посмотрите.
Aleksey
func swap(s *[]int) { n := (*s)[len((*s))-1] copy((*s)[1:], (*s)[0:len((*s))-1]) (*s)[0] = n }
Aleksey
https://play.golang.org/p/-6cVcSWbzYE
Aleksey
Выделение только одного инта
Zver
https://play.golang.org/p/-6cVcSWbzYE
тоже о copy сейчас подумал, глядя в документацию.
Aleksey
Неудобно на телефоне... почему то не всегда ссылку с плэйголанга скопировать удаётся
Zver
Неудобно на телефоне... почему то не всегда ссылку с плэйголанга скопировать удаётся
Можно и не по ссылке передавать. Так как изменения только внутри слайса. https://play.golang.org/
Aleksey
бэнчмарки сделать нужно
Artem
бэнчмарки сделать нужно
https://gist.github.com/xogeny/b819af6a0cf8ba1caaef
Artem
там все довольно спорно и есть в конце ссылка на продолжение, в любом случае нужно на конкретном примере тестировать и смотреть что в итоге будет лучше. Но да так тоже интересно.
Aleksey
По памяти бэнчмарки
Artem
По памяти бэнчмарки
мы же в 2018 году, тут память не то чтобы совсем критична :)
Aleksey
Да? Дело ещё в скорости её выделения и уборки потом гб
Artem
Тестировал на 100к примерно, больше вряд ли нужно. Но мало ли )
Artem
И там числа в пределах 10^5 внутри
Alexey
коллеги, драйвер для кликхауса посоветуйте пожалуйста, желательно http, а то на гитхабе их целый зоопарк, не уверен с которым стоит связываться
Nik
Спроси там, им виднее
Alexey
там я тоже спросил
Zver
Тестировал на 100к примерно, больше вряд ли нужно. Но мало ли )
BenchmarkCopy-4 20000 93049 ns/op 40 B/op 0 allocs/op BenchmarkAppend-4 5000 272002 ns/op 802986 B/op 2 allocs/op BenchmarkAppendPreallocate-4 5000 346201 ns/op 802976 B/op 1 allocs/op Получается с Copy намного быстрей.
Artem
да как то даже слишком
Zver
да как то даже слишком
А архиве сам бенч, может что-то упустил.
Artem
А архиве сам бенч, может что-то упустил.
да вроде все верно, возможно из за операций с указателями потери, все же не должны они так сильно отличаться
Zver
да вроде все верно, возможно из за операций с указателями потери, все же не должны они так сильно отличаться
Выделение памяти наверное столько отжирает, до сборщика мусора не уверен, что доходит за время теста.
Aleksey
Странно что с copy 0 алокаций и при этом 40 байт на операцию, там переиспользуется что ли память