<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serov.eu &#187; golang</title>
	<atom:link href="https://serov.eu/?feed=rss2&#038;tag=golang" rel="self" type="application/rss+xml" />
	<link>https://serov.eu</link>
	<description>Блог программиста</description>
	<lastBuildDate>Thu, 30 Apr 2026 12:31:53 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1.15</generator>
	<item>
		<title>дженерики в go с версии Go 1.18</title>
		<link>https://serov.eu/?p=1060</link>
		<comments>https://serov.eu/?p=1060#comments</comments>
		<pubDate>Sat, 12 Apr 2025 15:57:29 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1060</guid>
		<description><![CDATA[С введением дженериков (с версии Go 1.18) можно писать функции и типы, которые работают с различными типами данных, обеспечивая при этом строгую типизацию и переиспользование кода. &#160; &#160; &#160; Пример кода package main import "fmt" // Обобщённая функция Swap меняет местами два значения любого типа. // T — параметр типа, а ограничение any означает, что &#8230; <a href="https://serov.eu/?p=1060" class="more-link">Читать далее <span class="screen-reader-text">дженерики в go с версии Go 1.18</span></a>]]></description>
				<content:encoded><![CDATA[<p>С введением дженериков (с версии Go 1.18) можно писать функции и типы, которые работают с различными типами данных, обеспечивая при этом строгую типизацию и переиспользование кода.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Пример кода</p>
<pre>package main

import "fmt"

// Обобщённая функция Swap меняет местами два значения любого типа.
// T — параметр типа, а ограничение any означает, что функция принимает аргументы любого типа.
func Swap[T any](a, b T) (T, T) {
	return b, a
}

// Обобщённый тип Box хранит значение произвольного типа T.
type Box[T any] struct {
	value T
}

// Метод Get возвращает значение, хранящееся в Box.
func (b Box[T]) Get() T {
	return b.value
}

// Метод Set присваивает новое значение полю value.
func (b *Box[T]) Set(value T) {
	b.value = value
}

func main() {
	// Пример использования функции Swap с числами
	a, b := 10, 20
	a, b = Swap(a, b)
	fmt.Println("После обмена:", a, b)

	// Пример использования типа Box для хранения значения int
	intBox := Box[int]{value: 100}
	fmt.Println("Значение в intBox:", intBox.Get())

	// Пример использования типа Box для хранения значения string
	strBox := Box[string]{value: "hello"}
	fmt.Println("Значение в strBox:", strBox.Get())
}


</pre>
<p>&nbsp;</p>
<h3 class="" data-start="1299" data-end="1319">Как это работает</h3>
<ol data-start="1321" data-end="2557">
<li class="" data-start="1321" data-end="1681">
<p class="" data-start="1324" data-end="1681"><strong data-start="1324" data-end="1356">Параметры типа и ограничения</strong><br data-start="1356" data-end="1359" /> В объявлении функции <code data-start="1383" data-end="1396">Swap[T any]</code> параметр типа <code data-start="1411" data-end="1414">T</code> записывается в квадратных скобках сразу после имени функции. Ограничение <code data-start="1488" data-end="1493">any</code> (это синоним для <code data-start="1511" data-end="1524">interface{}</code>) указывает, что тип <code data-start="1545" data-end="1548">T</code> может быть любым. Таким образом, функция <code data-start="1590" data-end="1596" data-is-only-node="">Swap</code> способна принимать на вход значения любых типов, например, <code data-start="1656" data-end="1661">int</code>, <code data-start="1663" data-end="1671">string</code> и другие.</p>
</li>
<li class="" data-start="1683" data-end="1980">
<p class="" data-start="1686" data-end="1980"><strong data-start="1686" data-end="1704">Обобщённый тип</strong><br data-start="1704" data-end="1707" /> Тип <code data-start="1714" data-end="1726">Box[T any]</code> представляет контейнер, способный хранить значение любого типа. Методы <code data-start="1798" data-end="1803">Get</code> и <code data-start="1806" data-end="1811">Set</code> работают с этим значением, не теряя информации о типе. При создании экземпляра типа <code data-start="1896" data-end="1901">Box</code> компилятор подставляет конкретный тип, например, <code data-start="1951" data-end="1961">Box[int]</code> или <code data-start="1966" data-end="1979" data-is-only-node="">Box[string]</code>.</p>
</li>
<li class="" data-start="1982" data-end="2270">
<p class="" data-start="1985" data-end="2270"><strong data-start="1985" data-end="2020">Компиляция и безопасность типов</strong><br data-start="2020" data-end="2023" /> При вызове обобщённой функции или создании обобщённого типа компилятор Go подставляет конкретный тип вместо параметра <code data-start="2144" data-end="2147">T</code>. Это позволяет избежать дублирования кода и одновременно гарантирует, что типизация будет проверяться на этапе компиляции.</p>
</li>
<li class="" data-start="2272" data-end="2557">
<p class="" data-start="2275" data-end="2557"><strong data-start="2275" data-end="2302">Преимущества дженериков</strong><br data-start="2302" data-end="2305" /> Благодаря обобщённым типам и функциям можно писать более универсальный и переиспользуемый код, не прибегая к использованию небезопасных преобразований типов и интерфейсов. Это увеличивает читаемость и поддерживаемость кода, снижая количество ошибок.</p>
</li>
</ol>
<p>&nbsp;</p>
<p class="" data-start="0" data-end="227">Компилятор Go создаёт отдельную, специализированную версию функции (или типа) для каждого уникального набора типовых параметров, используемых в коде. Такой подход называется <strong data-start="207" data-end="226">монопорфизацией</strong>.</p>
<h3 class="" data-start="229" data-end="244">Разъяснения</h3>
<ul data-start="246" data-end="1066">
<li class="" data-start="246" data-end="529">
<p class="" data-start="248" data-end="529"><strong data-start="248" data-end="267">Монопорфизация:</strong><br data-start="267" data-end="270" /> При компиляции для каждой инстанциации обобщённого кода создаётся конкретный вариант с подставленным типом. Например, если функция <code data-start="403" data-end="416">Swap[T any]</code> вызывается для <code data-start="432" data-end="437" data-is-only-node="">int</code> и для <code data-start="444" data-end="452">string</code>, то компилятор сгенерирует две версии — одну для <code data-start="502" data-end="507">int</code>, другую для <code data-start="520" data-end="528">string</code>.</p>
</li>
<li class="" data-start="531" data-end="823">
<p class="" data-start="533" data-end="580"><strong data-start="533" data-end="550">Преимущества:</strong><br data-start="550" data-end="553" /> Такой механизм позволяет:</p>
<ul data-start="583" data-end="823">
<li class="" data-start="583" data-end="663">
<p class="" data-start="585" data-end="663">Оптимизировать код под конкретные типы, что может улучшать производительность.</p>
</li>
<li class="" data-start="666" data-end="734">
<p class="" data-start="668" data-end="734">Сохранять строгую типизацию и выявлять ошибки на этапе компиляции.</p>
</li>
<li class="" data-start="737" data-end="823">
<p class="" data-start="739" data-end="823">Избегать накладных расходов, связанных с преобразованиями типов во время выполнения.</p>
</li>
</ul>
</li>
<li class="" data-start="825" data-end="1066">
<p class="" data-start="827" data-end="1066"><strong data-start="827" data-end="848">Возможные нюансы:</strong><br data-start="848" data-end="851" /> Хотя для каждой инстанциации создаётся своя версия, компилятор может применять оптимизации (например, инлайнинг или другие методы оптимизации кода), что помогает снизить потенциальное увеличение размера бинарника.</p>
</li>
</ul>
<p class="" data-start="1068" data-end="1226">Таким образом, реализация дженериков в Go через монопорфизацию делает возможным написание обобщённого кода без потери производительности и безопасности типов.</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1060</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang замена тернарного оператора</title>
		<link>https://serov.eu/?p=1049</link>
		<comments>https://serov.eu/?p=1049#comments</comments>
		<pubDate>Wed, 13 Nov 2024 10:25:48 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1049</guid>
		<description><![CDATA[golang замена тернарного оператора Name: func() string { if line.Nomenclature != nil { return line.Nomenclature.Name } return "" }(),]]></description>
				<content:encoded><![CDATA[<p>golang замена тернарного оператора</p>
<pre>

Name: func() string {
   if line.Nomenclature != nil {
      return line.Nomenclature.Name
   }
   return ""
}(),

</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1049</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang max int</title>
		<link>https://serov.eu/?p=1043</link>
		<comments>https://serov.eu/?p=1043#comments</comments>
		<pubDate>Wed, 13 Nov 2024 10:21:21 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1043</guid>
		<description><![CDATA[Максимальный int в зависимости от системы package main import ( "fmt" ) func main() { maxInt := int(^uint(0) >> 1) fmt.Println("Максимальное значение int:", maxInt) }]]></description>
				<content:encoded><![CDATA[<p>Максимальный int в зависимости от системы</p>
<pre>
package main

import (
    "fmt"
)

func main() {
    maxInt := int(^uint(0) >> 1)
    fmt.Println("Максимальное значение int:", maxInt)
}


</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1043</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang</title>
		<link>https://serov.eu/?p=1003</link>
		<comments>https://serov.eu/?p=1003#comments</comments>
		<pubDate>Thu, 25 Apr 2024 13:58:23 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1003</guid>
		<description><![CDATA[package main import "fmt" func main() { status := GetPlan(1) fmt.Println(status) } func GetPlan(id int) string { return [...]string{ "plan1", "plan2", "plan3", }[id-1] }]]></description>
				<content:encoded><![CDATA[<pre>


package main

import "fmt"

func main() {

	status := GetPlan(1)
	fmt.Println(status)

}

func GetPlan(id int) string {
	return [...]string{
		"plan1",
		"plan2",
		"plan3",
	}[id-1]
}



</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1003</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Server Sent Event (SSE) with Go</title>
		<link>https://serov.eu/?p=995</link>
		<comments>https://serov.eu/?p=995#comments</comments>
		<pubDate>Sun, 07 Apr 2024 09:44:54 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=995</guid>
		<description><![CDATA[Source https://github.com/evgensr/sse package main import ( "fmt" "net/http" "time" ) func main() { http.HandleFunc("/events", eventsHandler) http.ListenAndServe(":8080", nil) } func eventsHandler(w http.ResponseWriter, r *http.Request) { // Set CORS headers to allow all origins. You may want to restrict this to specific origins in a production environment. w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Expose-Headers", "Content-Type") w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") &#8230; <a href="https://serov.eu/?p=995" class="more-link">Читать далее <span class="screen-reader-text">Server Sent Event (SSE) with Go</span></a>]]></description>
				<content:encoded><![CDATA[<p>Source <a href="https://github.com/evgensr/sse " title="https://github.com/evgensr/sse " target="_blank">https://github.com/evgensr/sse</a></p>
<pre>package main

import (
 "fmt"
 "net/http"
 "time"
)

func main() {
 http.HandleFunc("/events", eventsHandler)
 http.ListenAndServe(":8080", nil)
}

func eventsHandler(w http.ResponseWriter, r *http.Request) {
 // Set CORS headers to allow all origins. You may want to restrict this to specific origins in a production environment.
 w.Header().Set("Access-Control-Allow-Origin", "*")
 w.Header().Set("Access-Control-Expose-Headers", "Content-Type")

 w.Header().Set("Content-Type", "text/event-stream")
 w.Header().Set("Cache-Control", "no-cache")
 w.Header().Set("Connection", "keep-alive")

 // Simulate sending events (you can replace this with real data)
 for i := 0; i &lt; 10; i++ {
 fmt.Fprintf(w, "data: %s\n\n", fmt.Sprintf("Event %d", i))
 time.Sleep(2 * time.Second)
 w.(http.Flusher).Flush()
 }

 // Simulate closing the connection
 closeNotify := w.(http.CloseNotifier).CloseNotify()
 &lt;-closeNotify
}

</pre>
<pre> 

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;SSE Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;div id="sse-data"&gt;&lt;/div&gt;

 &lt;script&gt;
 const eventSource = new EventSource('http://localhost:8080/events');
 eventSource.onmessage = function(event) {
 const dataElement = document.getElementById('sse-data');
 dataElement.innerHTML += event.data + '&lt;br&gt;';
 };
 &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=995</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тестирование HTTP API</title>
		<link>https://serov.eu/?p=991</link>
		<comments>https://serov.eu/?p=991#comments</comments>
		<pubDate>Thu, 04 Apr 2024 10:10:24 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=991</guid>
		<description><![CDATA[Hypert &#8212; это библиотека Go с открытым исходным кодом, которая упрощает тестирование клиентов HTTP API. Она предоставляет удобный способ создания и воспроизведения HTTP запросов, и значительно упрощает создание надежных тестов для ваших клиентов API. ▪Запись и воспроизведение тестов ▪Автоматическое удаления конфиденциальной информации ▪Проверка запросов для обеспечения их целостности ▪Полная интеграция с GO протоколом http.Client ▪Легко &#8230; <a href="https://serov.eu/?p=991" class="more-link">Читать далее <span class="screen-reader-text">Тестирование HTTP API</span></a>]]></description>
				<content:encoded><![CDATA[<p class="p1"><b>Hypert</b> &#8212; это библиотека Go с открытым исходным кодом, которая упрощает тестирование клиентов HTTP API.</p>
<p class="p1">Она предоставляет удобный способ создания и воспроизведения HTTP запросов, и значительно упрощает создание надежных тестов для ваших клиентов API.</p>
<p class="p1">▪Запись и воспроизведение тестов</p>
<p class="p1">▪Автоматическое удаления конфиденциальной информации</p>
<p class="p1">▪Проверка запросов для обеспечения их целостности</p>
<p class="p1">▪Полная интеграция с GO протоколом http.Client</p>
<p class="p1">▪Легко расширяемые и настраиваемые опции</p>
<p class="p3">go get github.com/areknoster/hypert</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=991</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Оптимизация кода golang</title>
		<link>https://serov.eu/?p=983</link>
		<comments>https://serov.eu/?p=983#comments</comments>
		<pubDate>Sat, 02 Mar 2024 14:41:01 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=983</guid>
		<description><![CDATA[Когда мы фильтруем фрагменты в Go, типичным решением является создание нового фрагмента для отфильтрованных элементов (var filtered []int). Однако этот метод приводит к дополнительному выделению памяти, потому что мы создаём пустой слайс, и при каждом добавлении элемента нужно будет заново аллоцировать память. Более разумным способом решения этой проблемы является такое создание filtered := numbers[:0] Так &#8230; <a href="https://serov.eu/?p=983" class="more-link">Читать далее <span class="screen-reader-text">Оптимизация кода golang</span></a>]]></description>
				<content:encoded><![CDATA[<p class="p1">Когда мы фильтруем фрагменты в Go, типичным решением является создание нового фрагмента для отфильтрованных элементов (<span class="s1">var filtered []int</span>).</p>
<p class="p1">Однако этот метод приводит к дополнительному выделению памяти, потому что мы создаём пустой слайс, и при каждом добавлении элемента нужно будет заново аллоцировать память.</p>
<p class="p1">Более разумным способом решения этой проблемы является такое создание <span class="s1">filtered := numbers[:0]</span></p>
<p class="p1">Так мы создадим слайс с ёмкостью <span class="s1">numbers</span> и избегаем дополнительных выделений памяти в дальнейшем</p>
<p>В выражении <code>numbers[:0]</code>, <code>0</code> указывает на индекс, до которого (не включая его) будут скопированы элементы из среза <code>numbers</code>. По сути, это создает новый срез, который имеет ту же емкость, что и исходный срез <code>numbers</code>, но не содержит никаких элементов.</p>
<p>Вот как это работает:</p>
<ul>
<li><code>numbers[:]</code> создает копию среза <code>numbers</code>, включая все его элементы.</li>
<li><code>numbers[:n]</code>, где <code>n</code> &#8212; это неотрицательное целое число, создает новый срез, который содержит первые <code>n</code> элементов <code>numbers</code>.</li>
<li><code>numbers[:0]</code> создает новый срез, который не содержит элементов, но имеет ту же емкость, что и <code>numbers</code>. Это означает, что при добавлении элементов в срез <code>filtered</code> с помощью функции <code>append</code> память будет выделена из исходного массива, который лежит в основе среза <code>numbers</code>, до тех пор, пока не будет превышена его емкость.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=983</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обновить все пакеты</title>
		<link>https://serov.eu/?p=980</link>
		<comments>https://serov.eu/?p=980#comments</comments>
		<pubDate>Fri, 09 Feb 2024 08:39:21 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=980</guid>
		<description><![CDATA[go get -u ./...]]></description>
				<content:encoded><![CDATA[<pre>
go get -u ./...
</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=980</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Состоялся релиз Go 1.22</title>
		<link>https://serov.eu/?p=977</link>
		<comments>https://serov.eu/?p=977#comments</comments>
		<pubDate>Thu, 08 Feb 2024 07:55:44 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=977</guid>
		<description><![CDATA[Состоялся релиз Go 1.22 Теперь range по int for i := range 10 { println(i) }]]></description>
				<content:encoded><![CDATA[<p>Состоялся релиз Go 1.22</p>
<p>Теперь range по int</p>
<pre>
for i := range 10 {
 println(i)
}
</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=977</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anti-Spam Bot</title>
		<link>https://serov.eu/?p=956</link>
		<comments>https://serov.eu/?p=956#comments</comments>
		<pubDate>Fri, 29 Sep 2023 07:15:54 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=956</guid>
		<description><![CDATA[Welcome to the Anti-Spam Bot project! This bot is designed to monitor and manage spam activities, ensuring smooth and uninterrupted conversations. &#160; https://github.com/evgensr/anti-spam &#160;]]></description>
				<content:encoded><![CDATA[<p dir="auto">Welcome to the Anti-Spam Bot project! This bot is designed to monitor and manage spam activities, ensuring smooth and uninterrupted conversations.</p>
<p>&nbsp;</p>
<p><a href="https://github.com/evgensr/anti-spam">https://github.com/evgensr/anti-spam</a></p>
<p><a href="https://serov.eu/wp-content/uploads/2023/09/photo_2023-09-29-13.14.16.jpeg"><img class="alignnone size-large wp-image-957" src="https://serov.eu/wp-content/uploads/2023/09/photo_2023-09-29-13.14.16-1024x512.jpeg" alt="photo_2023-09-29 13.14.16" width="660" height="330" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=956</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
