Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Golang chapter 0070 #152

Open
wants to merge 12 commits into
base: main
Choose a base branch
from

Conversation

korepanov
Copy link
Contributor

No description provided.

@Microvenator
Copy link
Contributor

Будешь говорить про main(), точку входа в программу?

@Microvenator
Copy link
Contributor

Если у нескольких подряд идущих параметров функции совпадает тип, то его можно указать только для последнего из них. А для остальных пропустить.

Это тоже нужно сказать. С примерами.

@Microvenator
Copy link
Contributor

Нужно про вариадики сказать.

https://gobyexample.com/variadic-functions

@Microvenator
Copy link
Contributor

И про анонимные функции + замыкания.

https://gobyexample.com/closures

В данном примере использован прием форматирования строк: на место `%s` вставляется значение переменной `name`.

## Функции, возвращающие несколько значений
Функция может возвращать более одного значения. Часто в качестве последнего значения указывают значение специального типа `error` — ошибки. В случае, когда ошибка произошла, функция вернет значение этого типа с сообщением о том, что пошло не так. Если ошибки не было, то вернется `nil`. Получив ошибку, ее необходимо обработать на месте или вернуть выше. В случае, когда ошибка возникла в следствие неправильного программного кода, вызывают функцию `panic`. Функция `panic` немедленно завершает работу программы с сообщением о том, где произошла паника:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Функция panic заслуживает более подробного рассказа. Я бы предложила выделить раздел "Важные встроенные функции" (или просто "встроенные функции", если их немного). И в нем в качестве подраздела рассказать про panic, причем обязательно в связке с recover. Нужно объяснить:

  • В каких случаях может произойти паника
  • В каких случаях ее имеет смысл вызывать самому, а в каких - нет.
  • Чем она отличается от исключений

Copy link
Contributor Author

@korepanov korepanov Oct 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да. Нужно еще рассказать про:

  • функции как значения
  • вариадики
  • анонимные функции
  • замыкания
  • обработку ошибок
  • некоторые подводные камни, связанные с функциями

Но это все не влезет в одну главу. Поэтому здесь пока самое основное. В следующей главе буду про это рассказывать.

@@ -0,0 +1,288 @@
# Глава 7. Функции: часть 1
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А что планируется в части 2? Действительно ли нужно одну тему разбивать на две главы? Имхо такой подход не очень хорошо смотрится. Ну представь:

Глава 7. Функции: часть 1
Глава 8. Функции: часть 2
Глава 9. Горутины: часть 1
...И далее.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Что планируется в части два - написал выше. Давай сделаем так. Я напишу все в одной главе пока что. А потом будем думать, как разбить, если нужно.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, давай так и поступим!

Мне кажется, напрашивается такое разбиение: глава про функции и глава про встроенные функции + дефер

@@ -0,0 +1,288 @@
# Глава 7. Функции: часть 1
## Понятие функции
Как и в других языках программирования, функции в Go позволяют многократно использовать один и тот же код. Мы уже встречались с функциями ранее. В данной главе будут рассмотрены базовые темы по функциям. О прочих возможностях по работе с функциями будет рассказано далее в этом курсе.
Copy link
Contributor

@Microvenator Microvenator Oct 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как и в других языках программирования, функции в Go позволяют многократно использовать один и тот же код.

Читатель это точно понимает.

Мы уже встречались с функциями ранее. В данной главе будут рассмотрены базовые темы по функциям.

Именно что функции были почти в каждой задачи. Поэтому "базовые вещи" пользователь уже ухватил и из-за этого это предложение читается странно.

Я бы предложила переформулировать весь абзац. И заменить название пункта с "понятие функции" (потому что никакого определения здесь не дается) на "Определение и вызов функции"

Чтобы сделать код функции более лаконичным, иногда используют именованные возвращаемые значения:

```go {.example_for_playground .example_for_playground_002}
func average(myslice []float64) (res float64) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

myslice - плохой нейминг.


func mul64(left, right uint64) (uint64, error) {

if left > math.MaxUint64/right {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем здесь эта проверка? Впервые вижу проверку на переполнение внутри функции факториала. Обычно ее не делают, потому что она делает функцию драматически медленнее)

https://github.com/dougwatson/Go/blob/v3.0.1/math/factorial/factorial.go#L20

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Факториал очень быстро растет. 21! уже вызовет переполнение для unit64. Это может вызвать большое удивление у пользователя такой функции.

@@ -0,0 +1,712 @@
# Глава 7. Функции
## Объявлении и вызов функции
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Объявлении -> объявление

```

## Именованные возвращаемые значения
Чтобы сделать код функции более лаконичным, иногда используют именованные возвращаемые значения:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пример хороший. Но кажется, его недостаточно. Объясни плиз словами.

```

## Отложенные вызовы функций
Вызов функции бывает удобно отложить. Например, при выводе приветствия пользователю мы точно знаем, что в конце программы попрощаемся с ним. Чтобы не забыть это сделать в последствии, используют ключевое слово `defer`:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в последствии -> впоследствии

}
```

Вызов функции `goodbuy` откладывается до завершения функции `main`, независимо от того, как эта функция завершится: с ошибкой или без нее. Допустимо откладывать любой количество вызов. Выполняются они в порядке, обратном тому, в котором были отложены.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

откладывать любой количество вызов -> любое

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выполняются они в порядке, обратном тому, в котором были отложены.

Пример кода, пожалуйста.

Вызов функции `goodbuy` откладывается до завершения функции `main`, независимо от того, как эта функция завершится: с ошибкой или без нее. Допустимо откладывать любой количество вызов. Выполняются они в порядке, обратном тому, в котором были отложены.

## Аварийные ситуации
Компилятор языка Go проверяет все ошибки, которые может проверить, на этапе компиляции нашей программы. Однако существуют ошибки разработки, которые могут быть выявлены только на этапе времени выполнения. Например, выход за границы массива или разыменование нулевого указателя. В этих случаях возникает аварийная ситуация или, говоря в терминах языка Go, *паника (panic)*.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ошибки разработки -> ошибки

}()

time.Sleep(1 * time.Millisecond) // server is working
panic("memory leak")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай другое сообщение) А то как будто намеренно устроили утечку и радостно об этом сообщают))


func addUsers(newUsers ...string) {
for _, user := range newUsers {
users[id] = user
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай без глобальных переменных)

users[id] = user
id++
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Форматирование кода. Нет строки между скобкой и мэйном

}
```

В данном случае `userMessage` имеет тип `func(string)`. Попытка присвоить в эту переменную функцию с другой сигнатурой приведет к ошибке компиляции:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

переменную функцию?

}
```

Нулевым значением типа функции является `nil`. Вызов функции со значением `nil` приведет к панике:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нулевым значением типа функции является

Очень запутанная формулировка.

}
```
## Замыкания
Когда мы возвращаем некоторую функцию из другой функции, нам может потребоваться запомнить некоторое значение. Когда мы вернем эту функцию снова, то мы воспользуемся старым значением. Говоря более строго, некоторые функции имеют *состояние*. Такой прием предоставляют нам *замыкания (closures)*. Следующая программа вычисляет числа Фибоначчи с использованием замыкания:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Если читатель не знаком с замыканиями, "некоторое значение" ему ни о чем не скажет.


Функция `mul64` перемножает два числа типа `uint64` и возвращает ошибку в случае переполнения. Чтобы создать новую ошибку, пользуются функцией `New` пакета `errors`, куда передают сообщение об ошибке.

Существуют различные алгоритмы сортировки массива, однако часто говорят лишь об учебных примерах. Учебные алгоритмы, например, алгоритм сортировки пузырьком, работают медленно. Вычислительная сложность алгоритма сортировки пузырьком — *O(n^2)*. На практике используют более совершенные алгоритмы, например, алгоритм сортировки слиянием. Его вычислительная сложность — *O(n\*log(n))*. Смысл этого алгоритма состоит в том, что на каждом шаге мы разбиваем массив на две примерно равные части. Если число элементов нечетное, то слева окажется на один элемент больше. Повторяем процесс для каждой из половинок, пока не получим массивы длиной один. Массив из одного элемента всегда отсортирован. Затем начинаем объединять половинки. Идем параллельно по каждой из половинок. Если элемент в первой половинке меньше элемента второй половинки, то добавляем его в результирующий массив, после чего продвигаемся на один элемент вперед в первой половинке. Аналогично для второй половинки. Когда окажется, что одна из половинок закончилась, то необходимо дописать все оставшиеся элементы в конец результирующего массива.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Очень большой абзац. Разбей плиз на 2-3.

}
```

## Резюме.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Точка лишняя

```

## Резюме.
1. Объявление функции соответствует шаблону, однако некоторые из элементов этого шаблона необязательные.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Очень туманная фраза. Если ее уберем, ничего не потеряем. Лучше уж конкретизировать: в объявлении функции то-то и т-то необязательно.


## Резюме.
1. Объявление функции соответствует шаблону, однако некоторые из элементов этого шаблона необязательные.
2. Чтобы сократить объем программного кода, иногда бывает полезным сделать возвращаемые значения функции именованными, а некоторые типы принимаемых аргументов пропустить.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

программного кода -> кода

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

некоторые типы принимаемых аргументов пропустить.

Постарайся писать конкретнее. Часть моих замечаний относятся к одному и тому же - сложным пространным формулировкам, за которыми сложно увидеть четкий совет.

Лучше так. Если у подряд идущих параметров одинаковый тип, то его можно указать только для последнего параметра, а для предыдущих - пропустить.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants