автордың кітабынан сөз тіркестері Golang для профи: работа с сетью, многопоточность, структуры данных и машинное обучение с Go
Также помните, что сказал об оптимизации Джо Армстронг, один из разработчиков Erlang:
«Сначала сделай так, чтобы это работало, потом сделай так, чтобы оно было красивым, и только потом, если это действительно нужно, сделай так, чтобы оно работало быстро. В 90 % случаев, если ты сделаешь это красивым, оно само по себе будет работать быстро. Поэтому просто сделай это по-настоящему красивым!»
10 Ұнайды
https://github.com/PacktPublishing/Mastering-Go-Second-Edition
4 Ұнайды
https://github.com/PacktPublishing/Mastering-Go-Second-Edition
2 Ұнайды
«Сначала сделай так, чтобы это работало, потом сделай так, чтобы оно было красивым, и только потом, если это действительно нужно, сделай так, чтобы оно работало быстро. В 90 % случаев, если ты сделаешь это красивым, оно само по себе будет работать быстро. Поэтому просто сделай это по-настоящему красивым!»
1 Ұнайды
Как видим из Go-кода, представленного в файле errors.go, большая часть кода посвящена обработке ошибок, а не выполнению того, для чего, собственно, предназначена программа. К сожалению, это относится к большинству современных программ, разработанных на Go, а также на большинстве других языков программирования
Сначала указывается размер массива, затем его тип, а в конце — список элементов
претендентом для сборки мусора! Кроме того, объекты A, B и C являются корневыми объектами и всегда достижимы; следовательно, они не могут быть собраны как мусор.
ется до тех пор, пока не будут перебраны все объекты серого множества. Затем объекты белого множества считаются недостижимыми, и занимаемая ими память может использоваться повторно. Таким образом, считается, что в этот момент элементы белого множества попали в корзину.
Обратите внимание: если в какой-то момент сборки мусора объект из серого множества станет недостижимым, он будет обработан не в этом, а в следующем цикле сборки мусора! Это не оптимальный, но и не такой уж плохой вариант.
Приложение, работающее во время выполнения сборки мусора, называется мутатором. Мутатор запускает небольшую функцию, называемую барьером записи. Эта функция выполняется всякий раз, когда изменяется указатель в куче. Если указатель объекта в куче изменился, это означает, что данный объект теперь достижим. Барьер записи помечает этот объект в серый цвет и помещает в серое множество.
Мутатор отвечает за то, чтобы ни один элемент из черного множества не имел указателя на элемент из белого множества. Это достигается с помощью функции барьера записи. Невыполнение этого условия разрушило бы процесс сборки мусора и, скорее всего, привело бы к аварийному завершению работы программы.
В итоге кучу можно представить как граф, состоящий из связанных объектов. Такой граф показан на рис. 2.1, где также продемонстрирован один из этапов сборки мусора.
Рис. 2.1. В Go при сборке мусора в корзину область кучи программы можно представить в виде графа
Итак, у нас есть три цвета: черный, белый и серый. Когда алгоритм начинает работу, все объекты окрашены в белый цвет. По мере работы алгоритма белые объекты перемещаются в одно из двух остальных множеств: серое или черное. Те объекты, которые останутся в белом множестве, в какой-то момент будут удалены.
На представленном графе видно, что, хотя объект E, который относится к белому множеству, может получить доступ к объекту F, он сам недостижим из какого-либо другого объекта, потому что никакой другой объект не указывает на объект E. Это делает объект E идеальным
Итак, когда начинается сборка мусора, все объекты становятся белыми. Сборщик мусора перебирает все корневые объекты и окрашивает их в серый цвет. Корневые объекты — это объекты, к которым приложение может обращаться напрямую, включая глобальные переменные и другие элементы, находящиеся в стеке. Большинство этих объектов зависят от Go-кода конкретной программы.
После этого сборщик мусора выбирает серый объект, помечает его черным и проверяет, есть ли у него указатели на другие объекты из белого множества. Это означает, что при проверке серого объекта на предмет указателей на другие объекты он окрашивается в черный цвет. Если проверка обнаружит, что у данного объекта есть один или несколько указателей на белые объекты, алгоритм поменяет цвет этих белых объектов на серый. Процесс продолжа
Обратите внимание, что ни один объект не может перейти непосредственно из черного множества в белое — именно это обеспечивает работу алгоритма и позволяет освобождать память из-под объектов белого множества. Кроме того, ни один объект из черного множества не может напрямую указывать на объект из белого множества.
