<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Функции GoLang]]></title><description><![CDATA[<p dir="auto"><strong>Привет, друзья!</strong> <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44b.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--wave" style="height:23px;width:auto;vertical-align:middle" title="👋" alt="👋" /><br />
Недавно я окунулся в изучение Go (еще бы, язык, который создали сами гуглеры, сложно игнорировать <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f604.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--smile" style="height:23px;width:auto;vertical-align:middle" title="😄" alt="😄" />), и хочу поделиться своими первыми впечатлениями о функциях в этом языке. Если вы тоже новичок — добро пожаловать в мой “дневник начинающего гоферa”!</p>
<hr />
<h3>1. Функции в Go? Да это просто!</h3>
<p dir="auto">Начнем с базы. Объявить функцию можно через <code>func</code>, и сразу видно, что Go любит минимализм:</p>
<pre><code class="language-go">func hello() {
    fmt.Println("Привет, я функция!")
}
</code></pre>
<p dir="auto">А если нужно вернуть результат — добавляем тип возвращаемого значения:</p>
<pre><code class="language-go">func add(a int, b int) int {
    return a + b
}
</code></pre>
<p dir="auto"><em>Мое открытие:</em> В Go нет “магии” вроде перегрузки функций (как в C++ или Java), зато есть кристальная ясность. И это нравится!</p>
<hr />
<h3>2. Параметры: копии, указатели и “сколько угодно аргументов”</h3>
<p dir="auto">Что удивило:</p>
<ul>
<li><strong>Передача по значению</strong> — функция получает копию аргумента. Хочешь изменить оригинал? Используй указатели:<pre><code class="language-go">func double(number *int) {
    *number *= 2
}
</code></pre>
</li>
<li><strong>Вариативные функции</strong> с <code>...Type</code> — можно передать любое количество аргументов:<pre><code class="language-go">func sum(nums ...int) int {
    total := 0
    for _, v := range nums {
        total += v
    }
    return total
}
// Вызов: sum(1, 2, 3, 42)
</code></pre>
</li>
</ul>
<p dir="auto"><em>Прикол:</em> В Go даже слайсы передаются как копии, но это не проблема — они ссылаются на те же данные.</p>
<hr />
<h3>3. Множественный возврат и именованные результаты</h3>
<p dir="auto">Здесь Go выделяется: функция может вернуть несколько значений!</p>
<pre><code class="language-go">func swap(x, y string) (string, string) {
    return y, x
}
</code></pre>
<p dir="auto">А еще можно <strong>давать имена возвращаемым значениям</strong> — удобно для документирования и упрощения кода:</p>
<pre><code class="language-go">func calc(a, b int) (sum, product int) {
    sum = a + b
    product = a * b
    return // голый return!
}
</code></pre>
<p dir="auto"><em>Мое мнение:</em> Это круто, но надо не злоупотреблять — читаемость важнее.</p>
<hr />
<h3>4. Функции-анонимы и замыкания</h3>
<p dir="auto">Оказывается, в Go можно создавать анонимные функции и даже использовать замыкания! Пример счетчика:</p>
<pre><code class="language-go">func createCounter() func() int {
    count := 0
    return func() int {
        count++
        return count
    }
}
// Использование:
counter := createCounter()
fmt.Println(counter()) // 1
fmt.Println(counter()) // 2
</code></pre>
<p dir="auto"><em>Вау-эффект:</em> Замыкания позволяют “сохранять” состояние между вызовами. Это как мини-классы, но без ООП!</p>
<hr />
<h3>5. Функции как типы и callback-и</h3>
<p dir="auto">Go позволяет присваивать функции переменным и передавать их как аргументы. Например:</p>
<pre><code class="language-go">type Operation func(int, int) int

func compute(a, b int, op Operation) int {
    return op(a, b)
}

// Используем:
result := compute(5, 3, func(x, y int) int { return x * y })
</code></pre>
<p dir="auto"><em>Моя мысль:</em> Это открывает дверь к гибким абстракциям, вроде middleware или обработчиков событий.</p>
<hr />
<h3>6. Рекурсия: просто, но с осторожностью</h3>
<p dir="auto">Факториал в Go пишется классически:</p>
<pre><code class="language-go">func factorial(n int) int {
    if n == 0 {
        return 1
    }
    return n * factorial(n-1)
}
</code></pre>
<p dir="auto"><em>Важно:</em> Go не оптимизирует хвостовую рекурсию, поэтому глубокие вызовы могут “уронить” программу.</p>
<hr />
<h3><strong>Мои лайфхаки для начинающих:</strong></h3>
<ol>
<li><strong>Делайте функции короткими.</strong> Одна функция — одна задача.</li>
<li><strong>Возвращайте ошибки первым аргументом.</strong> Это стандарт Go:<pre><code class="language-go">func divide(a, b float64) (float64, error) { ... }
</code></pre>
</li>
<li><strong>Используйте <code>defer</code></strong> для закрытия ресурсов (файлы, соединения).</li>
</ol>
<hr />
<h3>Итог</h3>
<p dir="auto">Go заставляет писать простой и понятный код, а функции здесь — как кирпичики Lego: четкие, предсказуемые, но при этом мощные. Да, пришлось отвыкнуть от некоторых привычек (привет, ООП!), зато теперь я чувствую, как “дышит” язык.</p>
<p dir="auto">P.S. Если накосячил в примерах — пишите, исправлю. Всем добра! <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f680.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--rocket" style="height:23px;width:auto;vertical-align:middle" title="🚀" alt="🚀" /></p>
]]></description><link>https://forum.exlends.ru/topic/113/funkcii-golang</link><generator>RSS for Node</generator><lastBuildDate>Fri, 26 Jun 2026 23:22:22 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/113.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Apr 2025 08:30:42 GMT</pubDate><ttl>60</ttl></channel></rss>