<?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>Software Development &#8211; Kemal Burak Yılmaz</title>
	<atom:link href="http://www.kemalburakyilmaz.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kemalburakyilmaz.com</link>
	<description>Unutma Unutturma</description>
	<lastBuildDate>
	Mon, 04 Jan 2021 11:10:36 +0000	</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.1.8</generator>
	<item>
		<title>RabbitMQ</title>
		<link>http://www.kemalburakyilmaz.com/rabbitmq/</link>
				<pubDate>Sun, 03 Jan 2021 22:39:37 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=820</guid>
				<description><![CDATA[RabbitMQ&#160;uygulamalar arasindaki haberlesmeyi asenkron bir sekilde gerceklestirmek,&#160; daha olceklendirilebilir bir sisteme sahip olmak istenildiginde kullanilan bir Mesaj Kuyrugu sistemidir. Erlang dili ile gelisitirilmistir. Erlang, yogun concurrent islem yapilan, distributed sistemler icin tasarlanan bir dildir.&#160; 2007 yilinda open source olarak yayinlanmistir. Cross platform destekler. Bir cok dil icin destegi vardir. Anlisilir bir arayuze sahiptir. Guzel bir [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p><strong>RabbitMQ</strong>&nbsp;uygulamalar arasindaki haberlesmeyi asenkron bir sekilde gerceklestirmek,&nbsp; daha olceklendirilebilir bir sisteme sahip olmak istenildiginde kullanilan bir Mesaj Kuyrugu sistemidir.<br></p>



<ul><li>Erlang dili ile gelisitirilmistir. Erlang, yogun concurrent islem yapilan, distributed sistemler icin tasarlanan bir dildir.&nbsp;</li><li>2007 yilinda open source olarak yayinlanmistir.</li><li>Cross platform destekler.</li><li>Bir cok dil icin destegi vardir.</li><li>Anlisilir bir arayuze sahiptir.</li><li>Guzel bir dokumantasyonu vardir.</li></ul>



<p>RabbitMQ temel bilesenleri ve calisma mantigi en temel haliyle Sekil 1’deki gorselden anlasilabilir. Ozetle publisher tarafindan gonderilen mesaji, exchange ilgili queue ya iletir ve o kuyrugu dinleyen consumer tarafindan alip islenir.</p>



<ul class="wp-block-gallery columns-1 is-cropped"><li class="blocks-gallery-item"><figure><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/broker-1.png" alt="" data-id="833" data-link="http://www.kemalburakyilmaz.com/rabbitmq/broker-2/" class="wp-image-833" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/broker-1.png 694w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/broker-1-300x139.png 300w" sizes="(max-width: 694px) 100vw, 694px" /></figure></li></ul>



<h3><strong>Publisher/Producer</strong></h3>



<p>RabbitMQ ya mesajlari gonderen taraftir. Mesaj gonderilirken set edilen bazi bilgiler :</p>



<ul><li><strong>Exchange =</strong>&nbsp;Bu mesaji yonlendirecek exchange bilgisi</li><li><strong>Rounting Key =&nbsp;</strong>Hangi queulara iletilecegini belirten yonlendirme anahtari</li><li><strong>Content Type =&nbsp;</strong>Icerik turu, json payload olan mesajlar icin application/json olarak set edilmelidir.</li><li><strong>Mandatory =</strong>&nbsp;Default olarak “false” set edilir. Gonderilmek istenen mesaj bir sebepten dolayi kuyruga yonlendirilemediginde discard edilir. Eger bu alan “true” olarak set edilirse. Mesaj bir kuyruga yonlendirilemediginde, mesaj geri dondurulur.</li></ul>



<p>Bir mesajin RabbitMQ tarafindan basariyla kabul edildiginden emin olmak icin&nbsp;<strong>“confirm.select(Publisher confirms)”</strong>&nbsp;mekanizmasi kullanilir. Mesaj gonderildikten sonra, brokerdan&nbsp;<strong>Positive Ack</strong>(mesaji aldim) bilgisi donerse islem basarilidir. Eger&nbsp;<strong>Negative Ack</strong>(mesaji alamadim) donerse, loglama veya yeniden gondermeye calisma gibi islemler yapilabilir.<br><br>*Producer baglantilari genellikle uygulama ayaga kalkarken acilir ve uygulama calistigi surece yasarlar. Tek bir mesaj yayinlamak icin baglanti acma/kapama dogru bir yaklasim degildir.</p>



<h3><strong>Exchange</strong></h3>



<p>Gelen mesajlari, iclerindeki routing key ve exchant tipi bilgilerine gore ilgili kuyruklara yonlendiren aractir. 4 adet exchange tipi vardir.</p>



<p><strong><em>Direct Exchange =</em></strong>Default exchange tipidir. Mesajlar yalnizca routung ile tam olarak eslesen binding keye sahip olan kuyruklara iletilir. Mesajlarin tek bir kuyruga yonlendirilmesi icin idealdir fakat birden cok kuyruga yonlendirmek icin de kullanilabilir.</p>



<p>Sekil 2’deki ornekte 3 farkli routing keyi olan mesaj exchange ‘e gonderilmistir. Exchange yalnizca routing key ile birebir eslesen kuyruklara mesajlari iletmistir. Hatta M1 mesaji iki ayri kuyruga gonderilmistir. Sizin de farkedeceginiz uzere M3 mesajinin keyi birebir eslesmedigi icin herhangi bir kuyruga iletilemedi.</p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/direct.png" alt="" class="wp-image-806" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/direct.png 853w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/direct-300x85.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/direct-768x217.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/direct-810x229.png 810w" sizes="(max-width: 853px) 100vw, 853px" /><figcaption>Sekil 2<br></figcaption></figure>



<p><strong><em>Fanout Exchange =</em></strong>&nbsp;Mesajlar routing keylerine bakilmadan, bu exchange’e bagli tum kuyruklara iletilir. N adet kuyruk bu exchange’e bagliysa, yeni bir mesaj gonderildiginde N tane kuyruga iletilir.</p>



<p>Sekil 3’deki ornekte 2 farkli mesaj exchange’e gonderilmistir. Exchange routing keye bakmadan gelen mesajlari tum kuyruklara iletmistir.</p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/fanout.png" alt="" class="wp-image-812" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/fanout.png 889w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/fanout-300x77.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/fanout-768x196.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/fanout-810x207.png 810w" sizes="(max-width: 889px) 100vw, 889px" /><figcaption>Sekil 3<br></figcaption></figure>



<p><strong><em>Topic Exchange =</em></strong>&nbsp;En cok tercih edilen exchange tipidir. Mesajlar routing keylerine bakilarak, routing patterni ile eslesen kuyruklara iletilir.</p>



<p>Sekil 4’deki ornekte 2 farkli mesaj exchange’e gonderilmistir. Exchange routing keylere bakti ve M1 mesaji, patternlerine uydugu icin 2 ayri kuyruga iletildi. Fakat M2 mesaji hic bir patterne uymadigi icin iletilemedi.</p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/topic.png" alt="" class="wp-image-813" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/topic.png 853w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/topic-300x85.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/topic-768x217.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/topic-810x229.png 810w" sizes="(max-width: 853px) 100vw, 853px" /><figcaption>Sekil 4</figcaption></figure>



<p><strong><em>Header Exchange =</em></strong>&nbsp;Mesajlar header bilgileri icerisindeki ozellikleri ile “x-match” keyi ile eslesen kuyruklara iletilirler. Cok fazla kullanilan bir exchange tipi degildir.</p>



<h3><strong>Queue</strong></h3>



<p>Kendisine gelen mesajlari dogru bir sekilde consumerlara dagitmaya yarayan aractir. Bir queue tanimlanirken set edilebilen bazi ozellikler:</p>



<ul><li><strong>Durability =</strong> Kuyruk hakkindaki bilgilerin nerede tutulacaginin ve broker restart oldugunda da kuyrugun kaldigi yerden hayatina devam edip etmeyecegi kararinin verildigi ozelliktir. Durable/Transient olmak uzere iki secenek vardir. Default olarak durable secilidir, kuyruk bilgileri diskte tutulur ve broker restart olsa dahi kuyruk kaybolmaz. Transient de ise ram de saklanir.</li><li><strong>Exclusivity =</strong> Yalnizca bir connection icin kullanilir ve baglanti kapandiginda silinir.</li><li><strong>Auto-delete =</strong> Kuyrugu dinleyen consumer yoksa kuyruk otomatik olarak silinir.</li><li><strong>Args =</strong> Optional olarak set edilirler. Kullandigimiz bir kacina bakalim.<ul><li><strong>Time to live and expiration(TTL) = </strong>Bu ozellik ile kuyruktaki mesajlarin belirtilen sure bittikten sonra kuyruktan otomatik silinmesi saglanir. TTL kuyruga veya mesaja set edilebilir.</li><li><strong>Dead Letter Exchange(DLX) =</strong> Consumer tarafindan Nack ve requeue=false olarak isaretlenen bir mesajin, TTL suresi dolup kuyruktan silinen bir mesajin veya kuyrugun uzunluk limiti asildigi icin drop edilen bir mesajin baska bir kuyruga yonlendirilmesini saglayan ozelliktir.</li></ul></li></ul>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/dlx.png" alt="" class="wp-image-814" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/dlx.png 675w, http://www.kemalburakyilmaz.com/wp-content/uploads/2021/01/dlx-300x100.png 300w" sizes="(max-width: 675px) 100vw, 675px" /><figcaption>Sekil 5</figcaption></figure>



<p>DLX nedir daha iyi anlamak icin daha once tanimlanan kuyrugu inceleyelim. Sekil 5’de kuyruga dusen mesaj, 25 saniye sonra bu kuyruktan silinecek ve “Merchant-Exchange” icerisindeki, binding keyi “Test.Deneme.CreatedEvent_TryAgain” olan kuyruga iletilecek.</p>



<h3><strong>Consumer</strong></h3>



<p>Kuyruklari dinleyip, gelen mesajlari islemeye yarayan aractir. Consumerlar kuyruklari dinlemeye baslarken&nbsp;<strong>Acknowledgement</strong>&nbsp;modu set edilir.</p>



<ul><li><strong>Automatic =&nbsp;</strong>Mesaji kuyruktan silmek icin consumerdan onay beklemez. Fire and forget seklinde calisir.</li><li><strong>Manuel =</strong>&nbsp;Mesaji kuyruktan silmek icin consumerdan onay bekler. Consumer mesaji isledikten sonra herhangi bir hata almazsa RabbitMQ ya positive ack bilgisini gonderir ve mesaj kuyruktan silinir. Islem sirasinda bir hata alirsa RabbitMQ ya negative ack bilgisini ve mesaji yeniden kuyruga gonderilip gonderilmeyecegi bilgisini gonderir.<br></li></ul>


<pre class="brush: plain; title: ; notranslate">
channel.basicAck(deliveryTag, true); //Positive ack bilgisini gonderir ve mesaj kuyruktan silinir.
</pre>


<p>** Nack ve reject arasindaki fark; reject yalnizca bir mesaj icin calisabiliryorken, nack birden fazla mesaj icin calisabilir.</p>


<pre class="brush: plain; title: ; notranslate">
channel.basicReject(deliveryTag, true); //Negative ack ve mesaji yeniden kuyruga al bilgisini gonderir.

channel.basicReject(deliveryTag, false); //Negative ack ve mesaji yeniden kuyruga alma,sal gitsin bilgisini gonderir.

channel.basicNack(deliveryTag, true, true); //Negative ack ve bu de
</pre>]]></content:encoded>
										</item>
		<item>
		<title>Golang Slices</title>
		<link>http://www.kemalburakyilmaz.com/golang-slices/</link>
				<pubDate>Sun, 18 Oct 2020 19:52:11 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=794</guid>
				<description><![CDATA[Slice lar; ayni tip ogeleri iceren , uzunluk siniri olmayan dizileri temsil ederler. []T seklinde tanimlanir. Bir slice; pointer, uzunluk ve kapasite bilesenlerinden olusur. Pointer(ptr) : Slice&#8217;in ilk ogesinin bellekteki adresini tutar.Length(len) : Slice&#8217;in uzunlugunu tutar.Capacity(cap) : Slice&#8217;in kapasitesini tutar. Yeni bir slice tanimlaninca bellekte bir yer ayrilir ve icerisinde ptr, len, cap bilgileri tutulur. [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p><strong>Slice</strong> lar; ayni tip ogeleri iceren , uzunluk siniri olmayan dizileri temsil ederler.  []T seklinde tanimlanir.  Bir slice; <em><strong>pointer</strong></em>, <strong><em>uzunluk</em></strong> ve <strong><em>kapasite</em></strong> bilesenlerinden olusur. </p>



<p><strong>Pointer</strong>(ptr) : Slice&#8217;in ilk ogesinin bellekteki adresini tutar.<br><strong>Length</strong>(len) : Slice&#8217;in uzunlugunu tutar.<br><strong>Capacity</strong>(cap) : Slice&#8217;in kapasitesini tutar.</p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/slice-1024x885.png" alt="" class="wp-image-799" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/slice-1024x885.png 1024w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/slice-300x259.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/slice-768x664.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/slice-810x700.png 810w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/slice-1140x986.png 1140w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Yeni bir slice tanimlaninca bellekte bir yer ayrilir ve icerisinde ptr, len, cap bilgileri tutulur. Slice icerisindeki bir elemana erismek istenildiginde bu bilgiler yeterli olacaktir.   </p>



<p>Slice&#8217;in 1. elemanina erismek istenildiginde, Golang once slice icerisindeki pointer bilgisi ile 0. elemana ulasir. Ardindan bellekte bulunan siradaki elemani isteyerek 1. elemana ulasir. Slice&#8217;in verileri bellekte stack&#8217;de sirali bir sekilde tutulur. </p>
]]></content:encoded>
										</item>
		<item>
		<title>Golang Diziler</title>
		<link>http://www.kemalburakyilmaz.com/golang-diziler/</link>
				<pubDate>Sat, 17 Oct 2020 18:48:31 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=783</guid>
				<description><![CDATA[Diziler, ayni tip ogelerden olusan sabit uzunluklu yapilardir. Uzunlugu degistirilemez ve sonradan dinamik olarak genisletilemez. Bu sebeplerden dolayi Golang icerisinde cok fazla tercih edilmez. Degerleriyle beraber dizi tanimlamak icin array literal kullanilabilir. Dizi tanimlarken uzunluk yerine &#8220;&#8230;&#8221; koyulursa, dizi uzunlugu elementlerin sayisina gore belirlenir. Asagidaki kod blogu calistirildiginda uzunluk ekrana 5 olarak yazilacaktir. Bir dizinin [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p>Diziler, ayni tip ogelerden olusan sabit uzunluklu yapilardir. Uzunlugu degistirilemez ve sonradan dinamik olarak genisletilemez. Bu sebeplerden dolayi <strong>Golang</strong> icerisinde cok fazla tercih edilmez. </p>


<pre class="brush: csharp; title: ; notranslate">
	var a [5]int             // 5 elementli int dizi tanimlar
	fmt.Println(a[0])        // 1. elementi yazar
	fmt.Println(a[len(a)-1]) // Son elementi yazar, a[4]
</pre>


<p>Degerleriyle beraber dizi tanimlamak icin <strong><em>array literal </em></strong>kullanilabilir.</p>


<pre class="brush: csharp; title: ; notranslate">
	var a [3]int = [3]int{1, 2, 3}
	var b [3]int = [3]int{1, 2} // Uzunlugunu 3 set ettigimiz icin son elementini default 0 atar
	fmt.Println(b[2]) // &quot;0&quot;
</pre>


<p> Dizi tanimlarken uzunluk yerine <strong><em>&#8220;&#8230;&#8221;</em></strong> koyulursa, dizi uzunlugu elementlerin sayisina gore belirlenir. Asagidaki kod blogu calistirildiginda uzunluk ekrana 5 olarak yazilacaktir.</p>


<pre class="brush: csharp; title: ; notranslate">
	a := [...]int{1, 2, 3, 4, 5}
	fmt.Print(len(a))
</pre>


<p>Bir dizinin boyutu, türünün bir parçasıdır yani [3] int ve [4] int farklı türlerdir. Ayni tip ve boyuttaki diziler karsilastirilabilirken, boyutlar farkli ise karsilastirirken hata verecektir. Diziler karsilastirilirken<strong> == </strong>veya <strong>!= </strong>operatorleri kullanilabilir.  </p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13-1024x243.png" alt="" class="wp-image-790" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13-1024x243.png 1024w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13-300x71.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13-768x182.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13-810x192.png 810w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13-1140x271.png 1140w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-17-at-21.48.13.png 1542w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Golang ile uygulama gelistirilirken dizi yerine slice ler daha fazla tercih edilmektedir. Bir sonraki makalede slice leri inceleyecegiz. </p>
]]></content:encoded>
										</item>
		<item>
		<title>Golang Packages</title>
		<link>http://www.kemalburakyilmaz.com/golang-packages/</link>
				<pubDate>Sat, 10 Oct 2020 15:05:35 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=775</guid>
				<description><![CDATA[Golang&#8217;de paketler diğer dillerdeki kütüphaneler veya modüllerle aynı amaca hizmet eder. Yeniden kullanılabilirlik, modülerlik, encapsulation işlemlerini destekler. Paket ismi best practice olarak içerisinde bulunduğu klasör ile aynı olmalıdır fakat bu zorunlu değildir. Paket tanımlama package keywordu ile yapılır. Aşağıdaki örnekte de gördüğünüz gibi testservice&#8217;i yazarken, kaynak kodun en üstünde paketi tanımladık ve adını içerisinde bulunduğu [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p><strong>Golang&#8217;de</strong> paketler diğer dillerdeki kütüphaneler veya modüllerle aynı amaca hizmet eder. Yeniden kullanılabilirlik, modülerlik, encapsulation işlemlerini destekler.</p>



<p><strong class="has-text-color has-vivid-red-color">Paket ismi best practice olarak içerisinde bulunduğu klasör ile aynı olmalıdır fakat bu zorunlu değildir.</strong> Paket tanımlama <strong>package</strong> keywordu ile yapılır. Aşağıdaki örnekte de gördüğünüz gibi testservice&#8217;i yazarken, kaynak kodun en üstünde paketi tanımladık ve adını içerisinde bulunduğu klasörün adıyla<em>(services) </em>aynı belirttik. <strong>Her bir kaynak kodunda paket tanımlaması yapmak zorunludur.</strong></p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04-1024x272.png" alt="" class="wp-image-776" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04-1024x272.png 1024w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04-300x80.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04-768x204.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04-810x215.png 810w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04-1140x303.png 1140w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.24.04.png 1414w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Yukarıda yazdığımız paketi başka bir paket içerisinde kullanacağımız zaman, <strong>import</strong> etmemiz gerekir. Paketin path&#8217;ini vererek import edebiliriz veya Github üzerinde bir repository&#8217;deki path&#8217;ini verebiliriz.</p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12-1024x380.png" alt="" class="wp-image-777" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12-1024x380.png 1024w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12-300x111.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12-768x285.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12-810x301.png 810w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12-1140x423.png 1140w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-16.47.12.png 1466w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>package import<br></figcaption></figure>



<p><strong>Golang&#8217;de</strong> erişim belirleyici olarak fonksiyon veya değişkenlerin ilk harfi kullanılır.Diğer dillerde bu iş için public, private vs. keywordleri kullanılırken, Go&#8217;da<strong class="has-text-color has-vivid-red-color"> İlk harf büyük ise paket dışından erişilebilir, küçük ise dışarıdan erişilemez. </strong> Örnek olarak services paketi içerisinde bir tane ilk harfi büyük bir tane de küçük bir fonksiyon tanımlayıp, main paketi içerisinden çağırmayı deneyelim. </p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-17.07.38-1024x320.png" alt="" class="wp-image-778" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-17.07.38-1024x320.png 1024w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-17.07.38-300x94.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-17.07.38-768x240.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-17.07.38-810x253.png 810w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-10-at-17.07.38-1140x356.png 1140w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Plus &#8211; divide</figcaption></figure>



<p>Yukarıdaki ekran görüntüsünde de göreceğiniz gibi <strong class="has-text-color has-vivid-red-color">P</strong>lus ve <strong class="has-text-color has-vivid-red-color">d</strong>ivide fonksiyonlarını tanımladık. Başka bir paketten divide fonksiyonunu çağırmak istediğimizde kodumuz build olmadı ve unexported bir fonksiyona erişemezsiniz dedi.</p>
]]></content:encoded>
										</item>
		<item>
		<title>Golang Pointers</title>
		<link>http://www.kemalburakyilmaz.com/golang-pointers/</link>
				<pubDate>Sat, 09 May 2020 23:17:19 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=762</guid>
				<description><![CDATA[Değişkenler, değer içeren depolama parçalarıdır. Biz yaptığımız tanımlamalarda, değişkenlerin değerlerini okur veya onlara yeni değerler atarız. Pointer&#8216;lar ise değişkenlerin adresleridir. Yani Pointer değerin saklandığı konumdur. Her değerin bir adresi yoktur ama her değişkenin mutalaka bir adresi vardır. Pointer ile bir değişkenin adını kullanmadan hatta adını bilmeden, dolaylı olarak o değişkenin değerini okuyabilir veya güncelleyebiliriz. Golang [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p>Değişkenler, değer içeren depolama parçalarıdır. Biz yaptığımız tanımlamalarda, değişkenlerin değerlerini okur veya onlara yeni değerler atarız.</p>



<p><strong>Pointer</strong>&#8216;lar ise değişkenlerin adresleridir. Yani <strong>Pointer </strong>değerin saklandığı konumdur. Her değerin bir adresi yoktur ama her değişkenin mutalaka bir adresi vardır. <strong>Pointer </strong>ile bir değişkenin adını kullanmadan hatta adını bilmeden, dolaylı olarak o değişkenin değerini okuyabilir veya güncelleyebiliriz. <em>Golang </em>içerisinde <strong>Pointer </strong>denildiğin <strong>*</strong> ve <strong>&amp;</strong> operatörlerini bilmemiz gerekir. &amp; operatörü değişkenin adresini bulmakta kullanılırken, * operatörü ise Pointer&#8217;ın işaret ettiği adresteki değer alınır. Şimdi bu söylediklerimizi bir örnekle pekiştirelim. </p>



<pre class="wp-block-code"><code>package main

import "fmt"

func main() {
	kby := 58     //kby değişkenine 58 değerini atadık.
	emy := &amp;kby   //emy bir pointer oldu. İçerisinde kby değişkeninin tutulduğu bellek adresi var.
	fmt.Println("kby=", kby)  //kby değeri
	fmt.Println("emy pointer address=", emy) //bellek adresi
	fmt.Println("emy pointer value=", *emy)  //bellek adresindeki değer
}</code></pre>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/05/2020-05-10-01_28_47-Window.png" alt="" class="wp-image-768" width="380" height="92" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/05/2020-05-10-01_28_47-Window.png 313w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/05/2020-05-10-01_28_47-Window-300x73.png 300w" sizes="(max-width: 380px) 100vw, 380px" /><figcaption>Yukarıdaki programın çıktısı</figcaption></figure></div>



<p>Şimdi daha önce söylediğimiz gibi adını bile bilmediğimiz bir değişkenin değerini değiştirelim</p>



<pre class="wp-block-code"><code>package main

import "fmt"

func main() {
	//Önce kby isimli bir değişken tanımlauyacağız.
	//Ardından kby değişkenini pointer olarak emy atayacağız.
	//emy pointerını da kay isimli başka bir pointera atayacağız.
	//kay pointerının değerine 34 atayacağız.
	//En son tümünün değerlerine bakacağız.

	kby := 58     //kby değişkenine 58 değerini atadık.
	emy := &amp;kby   //emy bir pointer oldu. İçerisinde kby değişkeninin tutulduğu bellek adresi var.
	kay := emy
	*kay = 34

	fmt.Println("kby=", kby)  //kby değeri
	fmt.Println("emy pointer address=", emy) //bellek adresi
	fmt.Println("kay pointer address=", kay)  //bellek adresindeki değer

	fmt.Println("kby=", kby)  //kby değeri
	fmt.Println("emy value=", *emy) //bellek adresi
	fmt.Println("kay value=", *kay)  //bellek adresindeki değer
}</code></pre>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/05/2020-05-10-01_30_39-Window.png" alt="" class="wp-image-769" width="433" height="188" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2020/05/2020-05-10-01_30_39-Window.png 315w, http://www.kemalburakyilmaz.com/wp-content/uploads/2020/05/2020-05-10-01_30_39-Window-300x130.png 300w" sizes="(max-width: 433px) 100vw, 433px" /><figcaption>Gördüğünüz gibi kay pointerı üzerinden diğerlerinin değerlerini de değiştirdik.</figcaption></figure></div>



<h3>Fonksiyonlarda Pointer Kullanımı</h3>



<p><strong>Pointer</strong> bir değişkenin adresini içerdiğinden, bir fonksiyona <strong>Pointer </strong>bağımsız değişkeni iletilmesi, fonksiyonun dolaylı olarak gönderilen değişkeni güncelleştirmesini mümkün kılar. Sanırım örnekle daha iyi anlayacağız.</p>



<pre class="wp-block-code"><code>package main

import "fmt"

func main() {
	//İlk fonksiyonda parametre olarak pointer göndermedik.
	//Main fonksiyonu içerisindeki kby değişkenini etkilenmediğini gördük.
	
	//İkinci fonksiyonda ise pointer olarak gönderdik.
	//Kby değişkeninin değiştiğini siz de farketmiştirsiniz.
	//Alttaki çıktılara baktığımızda fonksiyon içerisindeki p değişkeni ile
	//Main fonksyionu içerisindeki kby değişkeninin hem değeri hem adresi aynıdır.

	kby := 58     //kby değişkenine 58 değerini atadık.

	incr(kby)
	fmt.Println("kby=", kby)  //kby değeri
	fmt.Println("kby pointer address=", &amp;kby)

	fmt.Println("***********")

	incrWithPointer(&amp;kby)
	fmt.Println("kby=", kby)  //kby değeri
	fmt.Println("kby pointer address=", &amp;kby)
}

func incr(p int) {
	p += 1
	fmt.Println("p value=", p) //p değeri
	fmt.Println("p pointer address=", &amp;p)  //p bellek adresi
}

func incrWithPointer(p* int) {
	*p += 1
	fmt.Println("p value=", *p) //p değeri
	fmt.Println("p pointer address=", p)  //p bellek adresi
}</code></pre>
]]></content:encoded>
										</item>
		<item>
		<title>Golang Fonsiyonlar</title>
		<link>http://www.kemalburakyilmaz.com/golang-fonsiyonlar/</link>
				<pubDate>Sun, 01 Dec 2019 20:14:34 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=754</guid>
				<description><![CDATA[Golang&#8216;de fonksiyonlar n tane parametre alıp n tane parametre dönebilen kod parçalarıdır. Yukarıdaki kod örneğinden de anlayacağınız üzere; bir fonksiyon func anahtar sözcüğü ile başlar, fonksiyon adı ile devam eder. Parametre var ise parametre adı, parametre tipi ve son olarak fonksiyonun dönüş tipi belirtilir. Şimdi dışarıdan iki tane integer parametre alıp, onların ortalamalarını dönen bir [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p><strong>Golang</strong>&#8216;de fonksiyonlar <strong>n </strong>tane parametre alıp <strong>n </strong>tane parametre dönebilen kod parçalarıdır. </p>


<pre class="brush: csharp; title: ; notranslate">
func fonsiyon_adi(parametre_adi parametre_tipi) donus_degeri  {
	
}
</pre>


<p> Yukarıdaki kod örneğinden de anlayacağınız üzere; bir fonksiyon <strong><em>func</em></strong> anahtar sözcüğü ile başlar, fonksiyon adı ile devam eder. Parametre var ise parametre adı, parametre tipi ve son olarak fonksiyonun dönüş tipi belirtilir. </p>



<p>Şimdi dışarıdan iki tane integer parametre alıp, onların ortalamalarını dönen bir fonksiyon yazalım.</p>


<pre class="brush: csharp; title: ; notranslate">
package main

import &quot;fmt&quot;

func main()  {
	val1 := 8
	var val2 int = 2

	avg := GetAvg(val1,val2)

	fmt.Println(avg)
}

func GetAvg(val1 int, val2 int) int  {
	return (val1+val2)/2

}
</pre>


<p>Golang&#8217;de fonksiyonlar birden fazla değer dönebilir. Şimdi  ad ve soyadı aynı anda dönen bir fonksiyon yazalım. Ardından bu fonksiyondan dönen değerleri, değişkenlere set edip ekrana yazdıralım.</p>


<pre class="brush: csharp; title: ; notranslate">
package main

import &quot;fmt&quot;

func main()  {
	val1,val2 := SetNames()

	fmt.Println(val1)
	fmt.Println(val2)
}


func SetNames() (string,string)  {
	name := &quot;Burak&quot;
	surname := &quot;Yılmaz&quot;

	return name,surname
}
</pre>]]></content:encoded>
										</item>
		<item>
		<title>Golang Değişken Tanımlama</title>
		<link>http://www.kemalburakyilmaz.com/golang-degisken-tanimlama/</link>
				<pubDate>Sun, 01 Dec 2019 18:36:43 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=744</guid>
				<description><![CDATA[Golang&#8217;de değişkenler 3 farklı şekilde tanımlanabilir. Aşağıdaki örnekten de göreceğiniz gibi değişkenleri farklı tarzlarda tanımladık ve ekrana yazdırdık. Hepsinin çıktılarının aynı olduğunu göreceksiniz. Daha önce tanımladığımız bir değişkeni yeniden initialize etmeye çalıştığımızda aşağıdaki şekilde hata verecektir. Aşağıda name3 değişkenini yeniden tanımlamaya çalıştığımızda hata aldık.]]></description>
								<content:encoded><![CDATA[
<p>Golang&#8217;de değişkenler 3 farklı şekilde tanımlanabilir.  </p>



<p>Aşağıdaki örnekten de göreceğiniz gibi değişkenleri farklı tarzlarda tanımladık ve ekrana yazdırdık. Hepsinin çıktılarının aynı olduğunu göreceksiniz.</p>


<pre class="brush: csharp; title: ; notranslate">
package main

import &quot;fmt&quot;

func main()  {
	//Tarz 1
	var name1 string = &quot;Burak Yılmaz&quot;

	//Tarz 2
	var name2 = &quot;Burak Yılmaz&quot;

	//Tarz 3
	name3 := &quot;Burak Yılmaz&quot;

	fmt.Println(name1)
	fmt.Println(name2)
	fmt.Println(name3)
}
</pre>


<p>Daha önce tanımladığımız bir değişkeni yeniden initialize etmeye çalıştığımızda aşağıdaki şekilde hata verecektir. Aşağıda name3 değişkenini yeniden tanımlamaya çalıştığımızda hata aldık. </p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/12/2019-12-01-21_40_04-●-main.go-my-first-go-app-Visual-Studio-Code.png" alt="" class="wp-image-751" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/12/2019-12-01-21_40_04-●-main.go-my-first-go-app-Visual-Studio-Code.png 686w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/12/2019-12-01-21_40_04-●-main.go-my-first-go-app-Visual-Studio-Code-300x237.png 300w" sizes="(max-width: 686px) 100vw, 686px" /></figure>
]]></content:encoded>
										</item>
		<item>
		<title>Unit Test Nedir? Neden Yazılır?</title>
		<link>http://www.kemalburakyilmaz.com/unit-test-nedir-neden-yazilir/</link>
				<pubDate>Wed, 25 Sep 2019 08:39:06 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[c# test]]></category>
		<category><![CDATA[unit test]]></category>
		<category><![CDATA[unit test nasıl yazılır?]]></category>
		<category><![CDATA[unit test nedir?]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=727</guid>
				<description><![CDATA[Yazılım dünyası için eski benim için yeni bir konu olan unit test konusuna hızlıca bir göz atacağız. Yeni şirketimde yapılan her iş için unit test yazılıyor, bu da demek ki oluyor ki artık aktif olarak unit test yazacağım. Ben de her zaman yaptığım gibi yeni bir konuyu öğrenirken, burada da paylaşayım dedim 🙂 Unit test(birim [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p>Yazılım dünyası için eski benim için yeni bir konu olan unit test konusuna hızlıca bir göz atacağız.  Yeni şirketimde yapılan her iş için unit test yazılıyor, bu da demek ki oluyor ki artık aktif olarak unit test yazacağım. Ben de her zaman yaptığım gibi yeni bir konuyu öğrenirken, burada da paylaşayım dedim <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>Unit test(birim test), adından anlayacağımız üzere test edilebilen en küçük birimi test eden kod blogudur. Temelde yaptığı; kodun veya sınıfın, belli girdiler ile doğru çalışıp, istenilen sonucu üretip üretmediğini kontrol etmektir. Ufak ufak parçaları test ederek, bütün bir yazılımın en azından çalıştığını görebiliyoruz. </p>



<p>Peki unit testler ile akış içerisindeki tüm bugları bulabilir miyiz? Hayır! Birim testler yalnızca o birimi o fonksiyonu test eder. <br> Unit testler yazılım testlerinin  ilk adımıdır. Komple akışı test etmek için başka testler(integration test, api test vs) yapmak gerekir.</p>



<h2>Neden yazılır?</h2>



<ul><li>Başka developerlar bizim yazdığımız kodları nasıl kullanacaklarını unit testlere bakarak daha iyi anlayabilir.</li><li> Yazdığımız hiç bir kod sonsuza kadar aynı kalmaz. Elbet bir gün refactor edilecek veya eklemeler yapılacaktır. İşte kodun burasını değiştirirsem ne olur? Nereleri patlatırım vs gibi kafamızı kurcalayan sorulardan bizi kurtarır. Kodumuzu yazdıktan sonra unit testleri çalıştırmamız yeterli olacaktır. Bize patlayan çatlayan her yeri gösterir <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li><li>Bizleri kaliteli kod yazmaya teşvik eder. Düzgün birim testler yazabilmemiz için, test edeceğimiz sınıfın bileşenleri ile gevşek bağlı(loosely coupled) olması gerekir. Böylelikle biz de testlerimizi yazarken mocking yapabiliriz. Eğer sıkı sıkıya bağlı(tightly coupled) olsaydı; ki bu yazılımda istenmeyen bir durumdur, mock object kullanamazdık. Yazılım bileşenlerini birbirlerine gevşek bağlamak için Dependency Injection yöntemini kullanabiliri</li></ul>



<h2>Nasıl yazılmalıdır?</h2>



<ul><li><strong>Unit testler, kodu yazan developer tarafından yazılmalıdır.</strong></li><li><strong>Okunaklı olmalıdır.</strong></li><li><strong>Hızlı çalışmalıdır.</strong></li><li><strong>Test yazılan birim, bileşenlerinden izole edilmelidir.</strong></li><li><strong>Bağımlılıklar değil, yalnızca o birim test edilmelidir.</strong></li><li><strong>Yazılan her test yalnız bir senaryoyu test etmelidir.</strong></li><li><strong>Yazılan testler tak başına çalışabilmeli, birbirini hiç bir şekilde etkilememelidir.</strong></li><li><strong>Unit test yazarken isimlendirme çok önemlidir.Test isimleri açıklayıcı olmalıdır. Uzun olabilir. <em>MethodName_StateUnderTest_ExpectedBehavior&nbsp;</em> şeklindeki isimlerdirme standartını kullanabiliriz.</strong></li><li><strong>Test başarısız olduğunda anlaşılabilir bir data dönmelidir.</strong></li></ul>



<div class="wp-block-image"><figure class="aligncenter"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/unittest.gif" alt="" class="wp-image-730" /></figure></div>
]]></content:encoded>
										</item>
		<item>
		<title>Go Geliştirme Ortamının Hazırlanması ve İlk Kod</title>
		<link>http://www.kemalburakyilmaz.com/go-gelistirme-ortaminin-hazirlanmasi-ve-ilk-kod/</link>
				<pubDate>Fri, 13 Sep 2019 08:04:46 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=713</guid>
				<description><![CDATA[Go geliştirme ortamının hazırlanması çok zor değil ama ben yine de paylaşayım dedim. Benim bilgisayarım Windows olduğundan, bu ortama göre kurulumu yapacağız. Yukarıdaki şemadan da anlayacağınız gibi ilk önce Go Runtime&#8217;ı yükleyeceğiz. Bunun için aşağıdaki adrese giderek Windows sürümünü indirmeniz ve klasik next next diyerek yüklemeyi yapmanız yeterli olacak 🙂https://golang.org/dl/ Environmentları da aşağıdaki şekilde set [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p>Go geliştirme ortamının hazırlanması çok zor değil ama ben yine de paylaşayım dedim. Benim bilgisayarım Windows olduğundan, bu ortama göre kurulumu yapacağız.</p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1-1024x180.png" alt="" class="wp-image-715" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1-1024x180.png 1024w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1-300x53.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1-768x135.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1-810x142.png 810w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1-1140x200.png 1140w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/gosetup-1.png 1163w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Yukarıdaki şemadan da anlayacağınız gibi ilk önce Go Runtime&#8217;ı yükleyeceğiz. Bunun için  aşağıdaki adrese giderek Windows sürümünü indirmeniz ve klasik next next diyerek yüklemeyi yapmanız yeterli olacak <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br><a href="https://golang.org/dl/">https://golang.org/dl/</a> </p>



<p>Environmentları da aşağıdaki şekilde set ediyoruz. </p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/goenvironment.gif" alt="" /></figure>



<p>Bir sonraki adım Visual Studio Code&#8217;u yüklemek. Go geliştirmek için bir sürü IDE kullanabilirsiniz ama ben VsCode kullanıyorum. Aşağıdaki adresten indirerek, kolayca yükleyebilirsiniz.  <br><a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> </p>



<p>VsCode yüklemesi bittikten sonra extension&#8217;lardan Go eklentisi yüklememiz yeterli olacaktır.</p>



<p>Sıra geldi ilk kodumuzu yazmaya. my-first-go-app adında bir klasör oluşturdum ve VsCode&#8217;u açtım. Gerisi aşağıda <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<figure class="wp-block-image"><img src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/09/firstgo.gif" alt="" /></figure>
]]></content:encoded>
										</item>
		<item>
		<title>Golang(Go) Programlama Dili</title>
		<link>http://www.kemalburakyilmaz.com/go-programlama-dili/</link>
				<pubDate>Thu, 12 Sep 2019 20:28:12 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=697</guid>
				<description><![CDATA[Bu yazıda beraber Go nedir? Neden ortaya çıktı? Neden öğrenmeliyiz? sorularının cevaplarını inceledikten sonra, geliştirme ortamını hazırlayıp ufak ufak kodlar yazacağız. Aslında bu dilde çok tecrübeli değilim, yeni başladığım firmada bazı projeler Golang ile yazılmış. Bu yüzden hem öğrenecek hem de öğrendiklerimi size aktarmaya çalışacağım. Go nedir? Go; 2007 yılında geliştirilmeye başlanmış, Google tarafından desteklenen, [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p>Bu yazıda beraber <strong>Go </strong>nedir? Neden ortaya çıktı? Neden öğrenmeliyiz? sorularının cevaplarını inceledikten sonra, geliştirme ortamını hazırlayıp ufak ufak kodlar yazacağız. Aslında bu dilde çok tecrübeli değilim, yeni başladığım firmada bazı projeler <strong>Golang </strong>ile yazılmış. Bu yüzden hem öğrenecek hem de öğrendiklerimi size aktarmaya çalışacağım.</p>



<p><strong>Go </strong>nedir? <strong>Go</strong>; 2007 yılında geliştirilmeye başlanmış, Google tarafından  desteklenen, açık kaynak kodlu bir programlama dilidir. İlk kararlı sürümü 2012 yılında yayınlanmıştır. <br></p>



<blockquote class="wp-block-quote"><p>Go; basit, güvenilir ve verimli bir yazılım oluşturmayı kolaylaştıran açık kaynaklı bir programlama dilidir. <br></p><cite> <a href="https://golang.org/">https://golang.org/</a> </cite></blockquote>



<hr class="wp-block-separator"/>



<p>Neden geliştirildi? Google&#8217;ın yaşadığı  performans, zaman, uyumluluk, derleme gibi problemleri çözmek için geliştirmiştir. <strong>Go</strong>&#8216;nun bir çok avantajı olduğu gibi, dezavantajları da var.  <em>Generics </em>ve <em>error handling</em> olmaması dezavantaj gibi gözükmekte fakat bu özellikler performans kaybına sebep olduğu için bilerek konulmamış. Hatta performanslı çalışacağı bir yol bulmadıkça da eklemeyeceklermiş.</p>



<hr class="wp-block-separator"/>



<p>Neden öğrenmeliyiz? E öğrenmesi çok kolay <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Java veya C#&#8217;da olduğu gibi OOP&#8217;un derinliklerinde kaybolmuyor tam aksine kod yazarken şöyle bir ohhh diyorsunuz.</p>



<ul><li> İçerisinde sadece 25 tane keyword var :</li></ul>


<pre class="brush: plain; title: ; notranslate">
break     default      func    interface  select
case      defer        go      map        struct
chan      else         goto    package    switch
const     fallthrough  if      range      type
continue  for          import  return     var
</pre>


<ul><li>Performans odaklı</li><li>Tek bir binary dosyasına derlenir ve bunu çalıştığı sisteme göre yapar. Bağımlılığı yoktur ve runtime&#8217;ı içinde gelir. Yalnız bu durumda da output olarak çıkan bu dosyanın büyük olma gibi bir durum ortaya çıkıyor.</li><li> Native olarak gelen <em>concurreny </em>mimarisi gerçekten etkileyici. <em>Channel </em>denilen kavramlar üzerinden  aynı anda birden fazla fonksiyon çalıştırılabiliyoruz. Bu konuyu daha sonra derinlemesine inceleyelim bence <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li></ul>
]]></content:encoded>
										</item>
	</channel>
</rss>
