@gogolang

Страница 866 из 1630
Alexey
26.02.2018
20:27:55
Похоже, что bytes.Buffer и пакет binary

Michael
26.02.2018
20:28:22
маршал/анмаршал бинарных данных.
обычно у них пакет имеет строго опред. длину, поэтому можно аллоцировать массив байт заранее

Alexey
26.02.2018
20:28:32
Типа binary.BigEndian.Read

Michael
26.02.2018
20:29:25
та может там и liitle endian & mixed

Google
Michael
26.02.2018
20:29:44
или bcd & gsm7

Alexey
26.02.2018
20:29:59
Конечно. Это просто пример, который не сразу виден в документации

Nik
26.02.2018
20:30:13
Типа binary.BigEndian.Read
это для числовых то использую binary.LittleEndian.Uint16([]byte(raw)[20:22]),

Alexey
26.02.2018
20:30:48
Там есть Read, который может читать сразу много полей в структуру

Ну и bytes.Buffer тоже поможет

Nik
26.02.2018
20:31:10
А в обратку он умеет?

Alexey
26.02.2018
20:31:28
Write тоже есть

Nik
26.02.2018
20:32:03


Alexey
26.02.2018
20:33:15
https://golang.org/pkg/encoding/binary/#Read

Nik
26.02.2018
20:33:43
а, он от пакета пляшет, спс.

Vasily Romanov
26.02.2018
20:34:03
https://blog.golang.org/survey2017-results

Nik
26.02.2018
20:36:49
https://golang.org/pkg/encoding/binary/#Read
со string как я понимаю не полетит? или поймет 0x00 как конец строки?

Google
Alexey
26.02.2018
20:38:22
Не будет работать со строками, скорее всего

Со слайсами байт – будет

Daniel
26.02.2018
20:41:11
со string как я понимаю не полетит? или поймет 0x00 как конец строки?
само по себе не поймет. надо заводить bufio.Reader и на нем запускать ReadBytes

Nik
26.02.2018
20:41:36
само по себе не поймет. надо заводить bufio.Reader и на нем запускать ReadBytes
Там фикс длинна, так что вполне позовлительно

Но [n]byte как тип человечески к стрингам кажется не приводился к стрингам по моему посдлденему опыту. Пойду попробую еще раз

Kirill
26.02.2018
20:41:51
https://blog.golang.org/survey2017-results
я всё еще ржу насчёт



Nik
26.02.2018
20:42:02
cannot convert data.Mine (type [3]byte) to type string ?

Daniel
26.02.2018
20:42:54
это не слайс, а массив

Kirill
26.02.2018
20:42:57
cannot convert data.Mine (type [3]byte) to type string ?
string(data.Mine[:]), например

Daniel
26.02.2018
20:43:18
а мог бы дать парню погуглить

Nik
26.02.2018
20:43:33
а мог бы дать парню погуглить
вот одновременно с этим и прогуглил)

Kirill
26.02.2018
20:44:26
а мог бы дать парню погуглить
ну - извините, иногда помогаю людям, я исправлюсь :)

?

Nik
26.02.2018
20:44:48
-200 строк из кода, хороший вечер)

Kirill
26.02.2018
20:46:30
кстати, @onokonem, мне нужны твои ~мозги~ мысли по одному поводу)

Daniel
26.02.2018
20:46:39
давай

Kirill
26.02.2018
20:46:45
в личку закину, минуту

Daniel
26.02.2018
20:46:50
ок

Google
Kirill
26.02.2018
20:48:27
закинул

Wingman
26.02.2018
20:49:14
народ, а что будет быстрее и правильнее? 1) if strings.HasPrefix('xe') || strings.HasPrefix('ge') || strings.HasPrefix('te') ............... { } 2) регулярка типа ^(xe|ge|te|....) ?

Kirill
26.02.2018
20:51:07
я бы делал, грубо говоря, len(str) >= 2 && str[1] == 'e' && (str[0] == 'x' || str[0] == 'g' || str[0] == 't')

Wingman
26.02.2018
20:51:34
не

Kirill
26.02.2018
20:51:38
но, возможно, за такой код меня уже кто-то ненавидит :))

Wingman
26.02.2018
20:51:53
пример тебя ввел в заблуждение, там совсем не обязательно [1] == 'e' )

любые 2-3 первых символа могут быть, которые необходимо отматчить

до десятка в одном if

Kirill
26.02.2018
20:53:34
я бы возненавидел
я такой код документирую и объясняю, почему надо было так :))

Илья
26.02.2018
20:54:12
Switch по первым двум символам, в case их можно перечислить

Daniel
26.02.2018
20:54:17
народ, а что будет быстрее и правильнее? 1) if strings.HasPrefix('xe') || strings.HasPrefix('ge') || strings.HasPrefix('te') ............... { } 2) регулярка типа ^(xe|ge|te|....) ?
откуда взялся этот вопрос? были замеры, и регулярки оказались медленными? в любом случае, быстрее всего будет, наверное switch str[:2] { case "xe": ... case "ge": ... case "te": ... }

Wingman
26.02.2018
20:55:20
Kirill
26.02.2018
20:55:31
откуда взялся этот вопрос? были замеры, и регулярки оказались медленными? в любом случае, быстрее всего будет, наверное switch str[:2] { case "xe": ... case "ge": ... case "te": ... }
тоже вариант, если не учитывать то, что str eq не самый быстрый в гошке, тогда уж быстрее byteshash(str[:2]) и в кейсах xeHash etc.

но это не так читаемо

и вряд ли у тебя будет случай, когда ты бы упёрся в регулярку, которую тебе на прототип хватит с головой, а переделать ты после замеров успеешь практически всегда

Wingman
26.02.2018
20:56:35
да не, не упрусь-то точно

блин

да это ващщщще некритичный участок

просто решил спросить, как оптимальнее :)

Google
Илья
26.02.2018
20:57:24
Ну, регулярка тут оверкилл страшный

Wingman
26.02.2018
20:57:38
Илья
26.02.2018
20:58:24
Тоже верно

Илья
26.02.2018
21:00:35
просто решил спросить, как оптимальнее :)
Кстати, всегда можно сделать бенч, если не лень. Заодно попрактиковаться делать бенчи

Wingman
26.02.2018
21:00:53
ну да, вариант

Daniel
26.02.2018
21:01:33
не надо делать микробенчи. не надо. надо померять интегральную производительность, и все остальное делать тольео есть ее не хватает

Kirill
26.02.2018
21:02:53
binary.BigEndian.Uint16([]byte(str[:2]))
скорее всего, шустрее будет https://godoc.org/github.com/gramework/runtimer#BytesHash :)

строго говоря, там обычный memhash

Admin
ERROR: S client not available

Kirill
26.02.2018
21:12:16
но 14 операций + 7 конвертаций - больше, чем 6 конвертаций (которые оптимизируются compile-time) и 11 операций

(ref: runtime/hash64.go#L31, encoding/binary/binary.go#L77-78)

Nik
26.02.2018
21:39:55
Вопрос обратный возник - как перегнать string в [n]bytes? я сходу ответ ненагуглил

ваиринат с copy не позволяет это почеловечески записать в структуру без временных переменных

Aleksandr
26.02.2018
21:44:38
[strlen(...)]byte(str)

Как нибудь так

Nik
26.02.2018
21:45:13
[4]byte("ABCD"),

не летит

Aleksandr
26.02.2018
21:45:35
Демку сделай

Google
Nik
26.02.2018
21:45:56
ща

https://play.golang.org/p/rfPHOyi7PJP

Nik
26.02.2018
21:48:19
в формат header := Header{ Type: [4]byte("ABCD"), } это не ложится, но тоже вариант, спс

Kirill
26.02.2018
21:48:57
блин, Ник

а ты не думал, что обёртку написать можно, например?

Nik
26.02.2018
21:49:45
Да я сижу переламываю работу с сообщениями на binary.Read. И вылезают вот коллизии, дщумаю как крассивее их собрать

а ты не думал, что обёртку написать можно, например?
Не люблю обертки, особенно если без них можно обойтись. Но тут уже наверно никак(

(а такой красивый был)

сеттеры и геттеры еще с явы вызывают у меня ненависть

Kirill
26.02.2018
21:50:59
https://play.golang.org/p/U32tU1-9jnb

Nik
26.02.2018
21:53:04
https://play.golang.org/p/U32tU1-9jnb
спс, пойду пилить обертки на поля)

Wingman
26.02.2018
22:20:37
ого

сюрприз для меня

парсю огромный аутпут ; по мере парсинга - всё дико замедляется и тормозит

ковырял регекспы, тестил, мучался... оказалось, что дико медленная штука - конкатенация строки

типа result += currentString

(просто мысли вслух :)

Владимир
26.02.2018
22:21:58
Чем конкатенацию заменил в итоге?

Aleksandr
26.02.2018
22:22:01
а bytes buffer например? или string buffer из 1.10?

Wingman
26.02.2018
22:22:06
Nik
26.02.2018
22:22:11
типа result += currentString
а проверял, что быстрее? контактинация или Sprintf двух строк?

Daniel
26.02.2018
22:22:23
Вопрос обратный возник - как перегнать string в [n]bytes? я сходу ответ ненагуглил
никак. из массива в слайс - пожалуйста, а из слайса в массив - только копированием

Страница 866 из 1630