
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
или не рантайма, а пекедж какой-то

Google

Eldar
28.02.2017
14:32:28
И тут этот спамер((
Подскажите роадмап для начинающего голангера)
Ну т.е основы и самом можно выучить, а какой нить простенький набор для начинающего, что познать минимум

corpix
28.02.2017
14:33:54

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

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

Eldar
28.02.2017
14:39:01


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

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

Maxim
28.02.2017
15:29:06


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

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

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

Maxim
28.02.2017
15:31:22

Alexey
28.02.2017
15:32:31

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

Alexey
28.02.2017
15:32:44

Maxim
28.02.2017
15:32:54

Roman
28.02.2017
15:33:15

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

Alexey
28.02.2017
15:46:09

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

Alexey
28.02.2017
15:48:06
Это если кратко, если долго, то я не объясню

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

Alexander
28.02.2017
15:49:49

Maxim
28.02.2017
15:50:20

Alexander
28.02.2017
15:50:42

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
ну лучше сделать дефер который всё закроет

Alexey
28.02.2017
15:51:37

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

Alexey
28.02.2017
15:52:05

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
в конце концов с таким размахом этих каналов ты просто поймаешь на объемах гонку и конкурентную запись или чтение... да там много чего может быть

Subbotin
28.02.2017
15:57:48

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

Alexander
28.02.2017
16:03:09

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

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