@proGO

Страница 510 из 1674
time
28.02.2017
14:00:20
malloc() вызывает brk()

DESCRIPTION brk() and sbrk() change the location of the program break, which defines the end of the process's data segment (i.e., the program break is the first location after the end of the uninitialized data segment). Increasing the program break has the effect of allocating memory to the process; decreas‐ ing the break deallocates memory.

Daniel
28.02.2017
14:07:34
если выключить cgo - вообще ничего
helloworld - ничего, во всяком случае в 1.7. но какая-то часть рантайма подтягивает libc

или не рантайма, а пекедж какой-то

Google
Eldar
28.02.2017
14:32:28
И тут этот спамер((

Подскажите роадмап для начинающего голангера)

Ну т.е основы и самом можно выучить, а какой нить простенький набор для начинающего, что познать минимум

corpix
28.02.2017
14:33:54
Подскажите роадмап для начинающего голангера)
https://golang.org/doc/ вот тут хороший роадмап

Eldar
28.02.2017
14:35:02
Ну ок, а есть список простых задачек на синтаксис так сказать?

И есть ли какая нить хайповая либа для веба?

corpix
28.02.2017
14:37:39
У меня - нет, я сам придумываю себе задачи. Можно посмотреть go by example, например. И всякие ресурсы с челленджами, которые поддерживают go. А хайповые либы все на github, зачем об этом тут спрашивать?

corpix
28.02.2017
14:48:08
Ну вдруг что-то посоветуте исходя из своего опыта
Всё слижком быстро меняется. Ну а насчет советов... можно посмотреть стандартную библиотеку go, но осторожно потому что там хватает не очень хороших практик в большинстве модулей. Например: - возврат ошибок через error.New() чуть ли не во всей std либе - куча неэкспортированных вещей, которые как бы говорят разработчику "скопипасти меня чтобы кастомизировать или построить сверху что-то своё" - отвратительное именование полей в структурах однобуквенными идентификаторами - использование interface{} там, где этого можно было бы избежать Список можно продолжить не совсем удачными архитектурными решениями. Смотреть можно любой код, но делать вывод о его качестве каждый должен сам для себя

Pavel
28.02.2017
14:50:15
А какая хорошая практика по ошибкам?

Mikalai
28.02.2017
15:01:29
malloc() вызывает brk()
Обычно он все-таки вызывает mmap

corpix
28.02.2017
15:12:57
А какая хорошая практика по ошибкам?
Например такая: var ErrFoo = errors.New("...") func StaticError() error { return ErrFoo } // type ErrKey struct { name string } func (e ErrKey) Error() string { return fmt.Sprintf("Failed on key '%s'", e.name) } func NewErrKey(key string) error { return ErrKey{key} } func DynamicError() error { return NewErrKey("key name") } Преимущество в том что всегда можно проверить, что за ошибка была возвращена, либо сравнением с значением(StaticError), либо сравнением по типу(DynamicError). А подход с return errors.New("ololo") плох тем что оставляет разработчику лишь один способ узнать "что произошло" - сравнить сообщение об ошибке. За такое нужно отрывать руки.

Greg
28.02.2017
15:24:54
Когда бомбануло :)

Google
corpix
28.02.2017
15:26:47
Та не, всё впорядке. Только расстройств психики прибавляется потихоньку :)

Alexey
28.02.2017
15:28:05
Обычно разработчику всё равно, что призошло, если понятно, что действие не выполнилось. Файл, например, не переименовался. А вот если важно, что именно случилось - упал коннект в БД или там просто нет записи, то там возвращатся ErrNoRows

time
28.02.2017
15:30:05
Обычно он все-таки вызывает mmap
When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3). it depends

Maxim
28.02.2017
15:30:24
Я через fmt.Errorf() ошибку возвращаю, если это просто строка, а не error
На errors.Error() линтер ругается, что "лучше пользуйся fmt"

time
28.02.2017
15:30:30
Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2).

Alexey
28.02.2017
15:30:52
На errors.Error() линтер ругается, что "лучше пользуйся fmt"
У тебя какой-то неправильный линтер, и у него неправильная ругань :)

corpix
28.02.2017
15:30:52
Обычно разработчику всё равно, что призошло, если понятно, что действие не выполнилось. Файл, например, не переименовался. А вот если важно, что именно случилось - упал коннект в БД или там просто нет записи, то там возвращатся ErrNoRows
Не должно быть в стандартной библиотеке разделения на "эти ошибки не нужны" "а эти нужны". Либо все ошибки возвращаются строками, либо всем присваивается идентификатор для дальнейшего сравнения. Иначе, для стандартной библиотеки языка общего назначения, это путь в ад

Maxim
28.02.2017
15:32:34
Какой именно модуль в нём - не вспомню

Alexey
28.02.2017
15:32:44
Обычный gometalinter
Код в студию, чтоб ругался на errors.New("...")

corpix
28.02.2017
15:33:52
Можно считать его напутствием в некотором смысле, которое можно выразить так: "go не очень продуманный язык, так что не ожидай от него слижком многого"

Subbotin
28.02.2017
15:44:34
https://play.golang.org/p/igiMJMywN4 я делаю вот такую штуку. она читает построчно файл, потом пропускает строки по цепочке каналов которые их обрабатывают и фильтруют. вопрос в том как корректно завершаться. я чё-то не догоняю

подскажите, люди добрые

Maxim
28.02.2017
15:45:33
Код в студию, чтоб ругался на errors.New("...")
Блин, когда библу писал то была (пускай и не обязательная в исполнении) ругать на "поменяй errors.New() на fmt.Errorf()". Сейчас написав самый простой скрипт с errors не смог это повторить

Google
Maxim
28.02.2017
15:46:24
у тебя, наверно, было errors.New(fmt.Sprintf("aaa %v", bbb))
Кстати да, возможно. Я уже не помню.

Просто с того раза я только fmt.Errorf() и юзаю, вместо того чтобы ещё один пакет подключать



Subbotin
28.02.2017
15:49:35
каналы получается закрывать тоже по цепочке через дефер?

Maxim
28.02.2017
15:50:20
у тебя, наверно, было errors.New(fmt.Sprintf("aaa %v", bbb))
Да, ты прав - поймал: main.go:10:12:warning: should replace errors.New(fmt.Sprintf(...)) with fmt.Errorf(...) (golint) https://play.golang.org/p/uFFjBmSSqx

Alexander
28.02.2017
15:50:42
каналы получается закрывать тоже по цепочке через дефер?
хотя почти.. тебе нужен еще один chan bool на закрытие этой горутины

Alexey
28.02.2017
15:50:46
for scanner.Scan() { s := scanner.Text() string_chan <- s } Вот тут делать close(string_chan) Потом внутри стринг процессора, если канал закрыт - то закрывать выходной. И так далее.

А main должна ждать wg.Wait()

Alexander
28.02.2017
15:51:18
ну лучше сделать дефер который всё закроет

Subbotin
28.02.2017
15:51:54
а не будут эти проверки на не закрыт ли канал на каждом чтении тормозить все? или они очень дешёвые?

Alexander
28.02.2017
15:52:47
Где?
смотри.. мне кажется можно в принципе сделать проще

и не париться с этими каналами

Subbotin
28.02.2017
15:53:04
короче надо почитать про закрытие каналов

Alexander
28.02.2017
15:53:07
делай как ты делаешь в горутинах, но не используй для этого каналы

Google
Alexander
28.02.2017
15:53:29
почему нельзя делать асинхронно и только через последний канал принимать результат

я просто в принципе не понимаю зачем здесь столько каналов

Alexey
28.02.2017
15:54:53
короче надо почитать про закрытие каналов
Там надо не проверять, там надо писать просто в твоих процессорах for incomingString := range incomingChannel { outputString := process(incomingString) outputChannel <- outputString } close(outputChannel) ```wg.Done

Subbotin
28.02.2017
15:56:06
я просто в принципе не понимаю зачем здесь столько каналов
ну там на самом деле гораздо более разлапистая структура каналов. где-то несколько воркеров из одного читают на самой ресурсозатратной операции, где-то одна горутина пишет в несколько каналов. и т.п. и я ещё буду дополнять это

Admin
ERROR: S client not available

Subbotin
28.02.2017
15:56:21
я просто упростил для примера кода чтоб не тащить все

Alexander
28.02.2017
15:56:36
так я же не про это

горутины это очень легковесные операции

Alexey
28.02.2017
15:56:48
Ну вот range читает из канала, а когда канал закрывают - то он выходит из цикла.

Alexander
28.02.2017
15:57:37
в конце концов с таким размахом этих каналов ты просто поймаешь на объемах гонку и конкурентную запись или чтение... да там много чего может быть

Alexander
28.02.2017
15:58:01
а можешь без них просто фигачить горутины и их результат складывать в один канал

но для твоего случая можно сделать так

при выходе из цикла чтения файла - отправляешь в горутину в chan done bool <- true и по этому каналу вызываешь её закрытие

Subbotin
28.02.2017
15:59:07
а можешь без них просто фигачить горутины и их результат складывать в один канал
я готов пожертвовать вероятностью гонок в угоду удобству сборки разных конструкций из обработчиков

Alexander
28.02.2017
15:59:46
Subbotin
28.02.2017
16:00:04
Alexander
28.02.2017
16:00:23
а ты посмотри библиотеки

работающие например с сокетами

или какие нибудь rpc

Google
Alexander
28.02.2017
16:00:53
там специально делают done

что бы при каждом чихе не проверять открыт канал или нет

Subbotin
28.02.2017
16:02:01
там же таймауты и они читают из двух каналов сразу. а мне надо просто дождаться пока мои данне все перетекут по цепочке

кстати буферизованный канал же закроется только когда опустошится?

ну если через range его читать

Alexander
28.02.2017
16:02:54
хз, эту штуку не приходилось использовать..

Alexey
28.02.2017
16:02:57
кстати буферизованный канал же закроется только когда опустошится?
На вход закроется сразу, на выход - когда опустошится.

Subbotin
28.02.2017
16:03:39
короче спасибо

Alexey
28.02.2017
16:03:45
Я не знаю, может, с горутинами, switch'ами и <- done лучше, там надо всю задачу целиком смотреть, а мне неинтересно?

Subbotin
28.02.2017
16:03:49
вроде работает тестик

счас все перепилю

Alexander
28.02.2017
16:05:14
Я не знаю, может, с горутинами, switch'ами и <- done лучше, там надо всю задачу целиком смотреть, а мне неинтересно?
тут пока целиком картину не увидишь - точно никогда не узнаешь ) но твой вариант с range выглядит красивым (с учетом небольших объемов)

Subbotin
28.02.2017
16:09:23
А главное модульным

Страница 510 из 1674