{"id":32392,"date":"2025-10-21T06:41:01","date_gmt":"2025-10-21T03:41:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32392"},"modified":"2025-10-21T06:41:01","modified_gmt":"2025-10-21T03:41:01","slug":"go-ile-ilk-komut-satiri-aracinizi-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/","title":{"rendered":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma"},"content":{"rendered":"<p><body><\/p>\n<h2>Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma<\/h2>\n<h3>Giri\u015f: Komut Sat\u0131r\u0131 Ara\u00e7lar\u0131n\u0131n G\u00fcc\u00fc<\/h3>\n<p>Komut sat\u0131r\u0131 ara\u00e7lar\u0131 (CLI &#8211; Command Line Interface), yaz\u0131l\u0131m geli\u015ftiriciler ve sistem y\u00f6neticileri i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r. Otomasyon, sistem y\u00f6netimi, veri i\u015fleme ve h\u0131zl\u0131 prototipleme gibi bir\u00e7ok alanda merkezi bir rol oynarlar. Grafiksel aray\u00fczlerin sundu\u011fu kolayl\u0131\u011f\u0131n aksine, CLI ara\u00e7lar\u0131 daha h\u0131zl\u0131, daha esnek ve komut dosyalar\u0131 (script) arac\u0131l\u0131\u011f\u0131yla kolayca otomatize edilebilir bir etkile\u015fim sunar. Go (Golang), bu t\u00fcr ara\u00e7lar geli\u015ftirmek i\u00e7in m\u00fckemmel bir dil se\u00e7imidir. Performans\u0131, derlenmi\u015f tek bir ikili dosya (binary) olu\u015fturabilme yetene\u011fi, g\u00fc\u00e7l\u00fc standart k\u00fct\u00fcphanesi ve platformlar aras\u0131 uyumlulu\u011fu sayesinde Go, CLI ara\u00e7lar\u0131 geli\u015ftirenler aras\u0131nda h\u0131zla pop\u00fclerlik kazanm\u0131\u015ft\u0131r.<\/p>\n<p>Bu makalede, Go kullanarak s\u0131f\u0131rdan basit bir komut sat\u0131r\u0131 arac\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. <code>os.Args<\/code> ile temel arg\u00fcman i\u015fleminden ba\u015flayarak, Go&#8217;nun yerle\u015fik <code>flag<\/code> paketini kullanacak ve ard\u0131ndan end\u00fcstri standard\u0131 olan <code>cobra<\/code> k\u00fct\u00fcphanesi ile daha karma\u015f\u0131k, alt komutlara sahip bir ara\u00e7 geli\u015ftirece\u011fiz. Amac\u0131m\u0131z, Go&#8217;nun CLI geli\u015ftirme yeteneklerini ke\u015ffetmek ve kendi ara\u00e7lar\u0131n\u0131z\u0131 olu\u015fturman\u0131z i\u00e7in sa\u011flam bir temel sa\u011flamakt\u0131r.<\/p>\n<h3>Go Ortam\u0131n\u0131z\u0131 Haz\u0131rlama<\/h3>\n<p>Go ile geli\u015ftirme yapmaya ba\u015flamadan \u00f6nce, sisteminizde Go&#8217;nun kurulu oldu\u011fundan emin olmal\u0131s\u0131n\u0131z. Go&#8217;yu kurmak i\u00e7in resmi web sitesi olan [go.dev\/doc\/install](https:\/\/go.dev\/doc\/install) adresindeki talimatlar\u0131 takip edebilirsiniz. Kurulumu tamamlad\u0131ktan sonra, bir terminal penceresi a\u00e7\u0131p <code>go version<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak kurulumu do\u011frulayabilirsiniz. \u00c7\u0131kt\u0131 olarak Go s\u00fcr\u00fcm\u00fcn\u00fcz\u00fc g\u00f6rmelisiniz (\u00f6rne\u011fin, <code>go version go1.22.0 linux\/amd64<\/code>).<\/p>\n<p>Modern Go projeleri i\u00e7in mod\u00fcl sistemi (Go Modules) kullan\u0131l\u0131r. Bu, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmenin standart yoludur. Yeni bir proje ba\u015flatmak i\u00e7in, projeniz i\u00e7in bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">mkdir my-cli-tool\ncd my-cli-tool\ngo mod init github.com\/kullaniciadi\/my-cli-tool<\/code><\/pre>\n<p><code>go mod init<\/code> komutu, projeniz i\u00e7in bir <code>go.mod<\/code> dosyas\u0131 olu\u015fturur. Bu dosya, projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve Go s\u00fcr\u00fcm\u00fcn\u00fc tan\u0131mlar.<\/p>\n<h3>Temeller: Basit Bir &#8220;Merhaba, CLI!&#8221; Arac\u0131<\/h3>\n<p>Herhangi bir programlama dilinde oldu\u011fu gibi, Go&#8217;da da ilk ad\u0131m genellikle bir &#8220;Merhaba D\u00fcnya&#8221; program\u0131d\u0131r. CLI d\u00fcnyas\u0131nda bu, komut sat\u0131r\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131labilen basit bir program anlam\u0131na gelir. Proje dizininizde <code>main.go<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-go\">\/\/ main.go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"Merhaba, CLI d\u00fcnyas\u0131!\")\n}<\/code><\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalde a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">go run main.go<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 olarak <code>Merhaba, CLI d\u00fcnyas\u0131!<\/code> g\u00f6rmelisiniz. Bu, Go program\u0131n\u0131z\u0131 do\u011frudan \u00e7al\u0131\u015ft\u0131rman\u0131n h\u0131zl\u0131 bir yoludur. Ancak bir CLI arac\u0131 genellikle derlenmi\u015f bir ikili dosya olarak da\u011f\u0131t\u0131l\u0131r. Arac\u0131n\u0131z\u0131 derlemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">go build -o mycli<\/code><\/pre>\n<p>Bu komut, <code>mycli<\/code> ad\u0131nda bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya olu\u015fturur (Windows&#8217;ta <code>mycli.exe<\/code>). \u015eimdi bu dosyay\u0131 do\u011frudan \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">.\/mycli<\/code><\/pre>\n<p>Bu, Go ile ilk komut sat\u0131r\u0131 arac\u0131n\u0131z\u0131 ba\u015far\u0131yla derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z anlam\u0131na gelir.<\/p>\n<h3>Arg\u00fcmanlar\u0131 \u0130\u015fleme: <code>os.Args<\/code><\/h3>\n<p>Bir CLI arac\u0131n\u0131n temel i\u015flevlerinden biri, kullan\u0131c\u0131 taraf\u0131ndan sa\u011flanan arg\u00fcmanlar\u0131 i\u015flemektir. Go&#8217;nun standart k\u00fct\u00fcphanesi, <code>os<\/code> paketi arac\u0131l\u0131\u011f\u0131yla bu yetene\u011fi sunar. <code>os.Args<\/code> bir dize dilimi (slice of strings) olup, \u00e7al\u0131\u015ft\u0131r\u0131lan program\u0131n ad\u0131n\u0131 ve ard\u0131ndan gelen t\u00fcm komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 i\u00e7erir.<\/p>\n<p><code>main.go<\/code> dosyam\u0131z\u0131 g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-go\">\/\/ main.go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\tif len(os.Args) > 1 {\n\t\tname := os.Args[1] \/\/ \u0130lk arg\u00fcman\u0131 isim olarak al\n\t\tfmt.Printf(\"Merhaba, %s!\\n\", name)\n\t} else {\n\t\tfmt.Println(\"Merhaba, anonim kullan\u0131c\u0131!\")\n\t}\n}<\/code><\/pre>\n<p>Bu kodu derleyip \u00e7al\u0131\u015ft\u0131ral\u0131m:<\/p>\n<pre><code class=\"language-bash\">go build -o greeting\n.\/greeting\n<h2>\u00c7\u0131kt\u0131: Merhaba, anonim kullan\u0131c\u0131!<\/h2>\n\n.\/greeting Alper\n<h2>\u00c7\u0131kt\u0131: Merhaba, Alper!<\/h2>\n\n.\/greeting Go Programc\u0131s\u0131\n<h2>\u00c7\u0131kt\u0131: Merhaba, Go Programc\u0131s\u0131!<\/code><\/pre>\n<\/h2>\n<p><code>os.Args<\/code> ile arg\u00fcmanlar\u0131 do\u011frudan indeksleyerek eri\u015febilirsiniz. <code>os.Args[0]<\/code> her zaman program\u0131n ad\u0131d\u0131r. <code>os.Args[1]<\/code> ise ilk arg\u00fcman\u0131 temsil eder. Bu y\u00f6ntem basit durumlar i\u00e7in yeterli olsa da, adland\u0131r\u0131lm\u0131\u015f parametreler (bayraklar\/flag&#8217;ler) veya iste\u011fe ba\u011fl\u0131 arg\u00fcmanlar gibi daha karma\u015f\u0131k senaryolar i\u00e7in yetersiz kal\u0131r. \u00d6rne\u011fin, <code>--name Alper<\/code> gibi bir kullan\u0131m\u0131 do\u011frudan desteklemez. \u0130\u015fte burada Go&#8217;nun <code>flag<\/code> paketi devreye girer.<\/p>\n<h3>Bayraklar\u0131 Tan\u0131mlama: <code>flag<\/code> Paketi<\/h3>\n<p>Komut sat\u0131r\u0131 ara\u00e7lar\u0131 genellikle <code>program --bayrak de\u011fer<\/code> veya <code>program -b de\u011fer<\/code> gibi adland\u0131r\u0131lm\u0131\u015f arg\u00fcmanlar kullan\u0131r. Bunlara &#8220;bayrak&#8221; (flag) denir. Go&#8217;nun standart <code>flag<\/code> paketi, bu t\u00fcr bayraklar\u0131 kolayca tan\u0131mlaman\u0131z\u0131 ve ayr\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar.<\/p>\n<p><code>greeting<\/code> arac\u0131m\u0131z\u0131, <code>--name<\/code> bayra\u011f\u0131n\u0131 kullanacak \u015fekilde g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-go\">\/\/ main.go\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\t\/\/ 'name' ad\u0131nda bir string bayra\u011f\u0131 tan\u0131mla.\n\t\/\/ Varsay\u0131lan de\u011feri \"anonim\", kullan\u0131m mesaj\u0131 \"Kar\u015f\u0131lanacak isim\"\n\tnamePtr := flag.String(\"name\", \"anonim\", \"Kar\u015f\u0131lanacak isim\")\n\n\t\/\/ 'loud' ad\u0131nda bir boolean bayra\u011f\u0131 tan\u0131mla.\n\t\/\/ Varsay\u0131lan de\u011feri false, kullan\u0131m mesaj\u0131 \"Mesaj\u0131 y\u00fcksek sesle s\u00f6yle\"\n\tloudPtr := flag.Bool(\"loud\", false, \"Mesaj\u0131 y\u00fcksek sesle s\u00f6yle\")\n\n\t\/\/ Komut sat\u0131r\u0131 bayraklar\u0131n\u0131 ayr\u0131\u015ft\u0131r\n\tflag.Parse()\n\n\t\/\/ Bayrak de\u011ferlerine i\u015faret\u00e7iler arac\u0131l\u0131\u011f\u0131yla eri\u015f\n\tmessage := fmt.Sprintf(\"Merhaba, %s!\", *namePtr)\n\n\tif *loudPtr {\n\t\tmessage = fmt.Sprintf(\"%s Y\u00dcKSEK SESLE!!!\", message)\n\t}\n\n\tfmt.Println(message)\n}<\/code><\/pre>\n<p>\u015eimdi bu kodu derleyip farkl\u0131 bayraklarla \u00e7al\u0131\u015ft\u0131ral\u0131m:<\/p>\n<pre><code class=\"language-bash\">go build -o greeting-flags\n.\/greeting-flags\n<h2>\u00c7\u0131kt\u0131: Merhaba, anonim!<\/h2>\n\n.\/greeting-flags --name Alper\n<h2>\u00c7\u0131kt\u0131: Merhaba, Alper!<\/h2>\n\n.\/greeting-flags --name \"Go Geli\u015ftiricisi\" --loud\n<h2>\u00c7\u0131kt\u0131: Merhaba, Go Geli\u015ftiricisi! Y\u00dcKSEK SESLE!!!<\/h2>\n\n.\/greeting-flags -name Ahmet\n<h2>\u00c7\u0131kt\u0131: Merhaba, Ahmet! (Uzun form --name yerine -name de \u00e7al\u0131\u015f\u0131r)<\/h2>\n\n.\/greeting-flags --help\n<h2>\u00c7\u0131kt\u0131:<\/h2>\n<h2>Usage of .\/greeting-flags:<\/h2>\n<h2>-loud<\/h2>\n<h2>Mesaj\u0131 y\u00fcksek sesle s\u00f6yle<\/h2>\n<h2>-name string<\/h2>\n<h2>Kar\u015f\u0131lanacak isim (default \"anonim\")<\/code><\/pre>\n<\/h2>\n<p><code>flag<\/code> paketi, basit CLI ara\u00e7lar\u0131 i\u00e7in harikad\u0131r. <code>flag.String<\/code>, <code>flag.Int<\/code>, <code>flag.Bool<\/code> gibi fonksiyonlar, farkl\u0131 veri tiplerindeki bayraklar\u0131 tan\u0131mlaman\u0131z\u0131 sa\u011flar. <code>flag.Parse()<\/code> \u00e7a\u011fr\u0131s\u0131, komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 ayr\u0131\u015ft\u0131r\u0131r ve tan\u0131mlanm\u0131\u015f bayraklara de\u011ferlerini atar. Ayr\u0131ca, otomatik olarak bir <code>--help<\/code> mesaj\u0131 da olu\u015fturur.<\/p>\n<p>Ancak, <code>flag<\/code> paketi alt komutlar (\u00f6rne\u011fin, <code>git add<\/code>, <code>git commit<\/code> gibi) veya daha karma\u015f\u0131k yap\u0131land\u0131rmalar i\u00e7in uygun de\u011fildir. Bu noktada <code>cobra<\/code> gibi \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneler devreye girer.<\/p>\n<h3>Geli\u015fmi\u015f Bayrak Ayr\u0131\u015ft\u0131rma ve Alt Komutlar: <code>cobra<\/code> K\u00fct\u00fcphanesi<\/h3>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k CLI ara\u00e7lar\u0131 genellikle birden fazla alt komuta sahiptir. \u00d6rne\u011fin, <code>git<\/code> komutu <code>git add<\/code>, <code>git commit<\/code>, <code>git push<\/code> gibi alt komutlara sahiptir. Go d\u00fcnyas\u0131nda bu t\u00fcr yap\u0131lar\u0131 olu\u015fturmak i\u00e7in en pop\u00fcler ve g\u00fc\u00e7l\u00fc k\u00fct\u00fcphanelerden biri <code>cobra<\/code>&#8216;d\u0131r. <code>cobra<\/code>, Google taraf\u0131ndan geli\u015ftirilen <code>spf13\/viper<\/code> (yap\u0131land\u0131rma y\u00f6netimi i\u00e7in) k\u00fct\u00fcphanesinin de arkas\u0131ndaki ekip taraf\u0131ndan geli\u015ftirilmi\u015ftir.<\/p>\n<p><code>cobra<\/code>&#8216;n\u0131n temel \u00f6zellikleri \u015funlard\u0131r:<br \/>\n*   <strong>Alt Komutlar:<\/strong> S\u0131n\u0131rs\u0131z say\u0131da i\u00e7 i\u00e7e alt komutlar tan\u0131mlama yetene\u011fi.<br \/>\n*   <strong>Bayrak Y\u00f6netimi:<\/strong> Yerel (bir komuta \u00f6zel) ve kal\u0131c\u0131 (t\u00fcm alt komutlar i\u00e7in ge\u00e7erli) bayraklar\u0131 destekler.<br \/>\n*   <strong>Otomatik Yard\u0131m Mesajlar\u0131:<\/strong> Komutlar ve bayraklar i\u00e7in otomatik olarak <code>help<\/code> mesajlar\u0131 olu\u015fturur.<br \/>\n*   <strong>Arg\u00fcman Do\u011frulama:<\/strong> Komutlara ge\u00e7irilen arg\u00fcmanlar\u0131n say\u0131s\u0131n\u0131 ve t\u00fcr\u00fcn\u00fc do\u011frulama imkan\u0131.<br \/>\n*   <strong>Shell Otomatik Tamamlama:<\/strong> Bash, Zsh, Fish gibi kabuklar i\u00e7in otomatik tamamlama komutlar\u0131 olu\u015fturabilir.<\/p>\n<h4><code>cobra<\/code> Kurulumu<\/h4>\n<p>Yeni bir proje dizini olu\u015ftural\u0131m ve <code>cobra<\/code>&#8216;y\u0131 kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mkdir fileutil\ncd fileutil\ngo mod init github.com\/kullaniciadi\/fileutil\ngo get github.com\/spf13\/cobra<\/code><\/pre>\n<h4><code>cobra<\/code> ile Temel Yap\u0131<\/h4>\n<p><code>cobra<\/code> projeleri genellikle belirli bir dizin yap\u0131s\u0131n\u0131 takip eder:<br \/>\n*   <code>main.go<\/code>: Uygulaman\u0131n ana giri\u015f noktas\u0131. <code>cmd.Execute()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 i\u00e7erir.<br \/>\n*   <code>cmd\/<\/code>: T\u00fcm komut tan\u0131mlamalar\u0131n\u0131n bulundu\u011fu dizin.<br \/>\n    *   <code>cmd\/root.go<\/code>: Uygulaman\u0131n ana (root) komutunu tan\u0131mlar.<br \/>\n    *   <code>cmd\/info.go<\/code>: <code>info<\/code> alt komutunu tan\u0131mlar.<br \/>\n    *   <code>cmd\/hash.go<\/code>: <code>hash<\/code> alt komutunu tan\u0131mlar.<\/p>\n<p>\u015eimdi bu yap\u0131y\u0131 olu\u015ftural\u0131m ve basit bir <code>fileutil<\/code> arac\u0131 geli\u015ftirelim. Bu ara\u00e7, bir dosyan\u0131n bilgilerini g\u00f6sterecek (<code>info<\/code>) ve bir dosyan\u0131n MD5 \u00f6zetini hesaplayacak (<code>hash<\/code>).<\/p>\n<p><strong>1. <code>main.go<\/code>:<\/strong> Uygulaman\u0131n ba\u015flang\u0131\u00e7 noktas\u0131.<\/p>\n<pre><code class=\"language-go\">\/\/ main.go\npackage main\n\nimport (\n\t\"fileutil\/cmd\" \/\/ cmd dizinindeki paketimizi import ediyoruz\n)\n\nfunc main() {\n\tcmd.Execute() \/\/ Cobra komut a\u011fac\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\n}<\/code><\/pre>\n<p><strong>2. <code>cmd\/root.go<\/code>:<\/strong> Ana komutu tan\u0131mlar. Bu komut genellikle do\u011frudan bir i\u015f yapmaz, sadece alt komutlar\u0131 d\u00fczenler.<\/p>\n<pre><code class=\"language-go\">\/\/ cmd\/root.go\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com\/spf13\/cobra\"\n)\n\nvar (\n\tverbose bool \/\/ Global bir bayrak \u00f6rne\u011fi\n)\n\n\/\/ rootCmd, t\u00fcm alt komutlar i\u00e7in ana komuttur.\nvar rootCmd = &cobra.Command{\n\tUse:   \"fileutil\",\n\tShort: \"Dosya y\u00f6netimi i\u00e7in basit bir ara\u00e7\",\n\tLong: <code>fileutil, Go ile olu\u015fturulmu\u015f basit bir komut sat\u0131r\u0131 arac\u0131d\u0131r.\nDosya bilgisi alma ve dosya \u00f6zetini hesaplama gibi temel i\u015flevleri sa\u011flar.<\/code>,\n\t\/\/ Run: Bu komutun do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda ne yapaca\u011f\u0131n\u0131 tan\u0131mlar.\n\t\/\/ Alt komutlar\u0131 olan bir root komutu genellikle do\u011frudan bir i\u015f yapmaz.\n\t\/\/ Buray\u0131 bo\u015f b\u0131rakabilir veya bir yard\u0131m mesaj\u0131 g\u00f6sterebilirsiniz.\n\t\/\/ Run: func(cmd *cobra.Command, args []string) { fmt.Println(\"L\u00fctfen bir alt komut se\u00e7in.\") },\n}\n\n\/\/ Execute, rootCmd'u \u00e7al\u0131\u015ft\u0131r\u0131r. T\u00fcm alt komutlar i\u00e7in giri\u015f noktas\u0131d\u0131r.\nfunc Execute() {\n\tif err := rootCmd.Execute(); err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"Hata: %s\\n\", err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc init() {\n\t\/\/ Kal\u0131c\u0131 bayraklar (Persistent Flags): Bu komut ve t\u00fcm alt komutlar\u0131 taraf\u0131ndan kullan\u0131labilir.\n\trootCmd.PersistentFlags().BoolVarP(&verbose, \"verbose\", \"v\", false, \"Detayl\u0131 \u00e7\u0131kt\u0131 g\u00f6ster\")\n}<\/code><\/pre>\n<p><strong>3. <code>cmd\/info.go<\/code>:<\/strong> <code>info<\/code> alt komutunu tan\u0131mlar. Bu komut, bir dosyan\u0131n temel bilgilerini (boyut, de\u011fi\u015ftirme tarihi, izinler) g\u00f6sterir.<\/p>\n<pre><code class=\"language-go\">\/\/ cmd\/info.go\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com\/spf13\/cobra\"\n)\n\n\/\/ infoCmd, 'fileutil info <dosya_yolu>' komutunu temsil eder.\nvar infoCmd = &cobra.Command{\n\tUse:   \"info <dosya_yolu>\",\n\tShort: \"Bir dosyan\u0131n temel bilgilerini g\u00f6sterir\",\n\tLong: <code>Belirtilen dosyan\u0131n boyutunu, son de\u011fi\u015ftirme tarihini ve izinlerini g\u00f6sterir.\nKullan\u0131m: fileutil info <dosya_yolu><\/code>,\n\tArgs: cobra.ExactArgs(1), \/\/ Tam olarak 1 arg\u00fcman bekler (dosya yolu)\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tfilePath := args[0]\n\n\t\tfileInfo, err := os.Stat(filePath)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Hata: '%s' dosyas\u0131 bulunamad\u0131.\\n\", filePath)\n\t\t\t} else {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Hata: Dosya bilgileri al\u0131n\u0131rken bir sorun olu\u015ftu: %v\\n\", err)\n\t\t\t}\n\t\t\tos.Exit(1)\n\t\t}\n\n\t\tfmt.Printf(\"Dosya Ad\u0131: %s\\n\", fileInfo.Name())\n\t\tfmt.Printf(\"Boyut: %d bayt\\n\", fileInfo.Size())\n\t\tfmt.Printf(\"Son De\u011fi\u015fiklik: %s\\n\", fileInfo.ModTime().Format(time.RFC822))\n\t\tfmt.Printf(\"\u0130zinler: %s (%s)\\n\", fileInfo.Mode().String(), strconv.FormatUint(uint64(fileInfo.Mode().Perm()), 8))\n\n\t\tif verbose { \/\/ root komutunda tan\u0131mlanan global bayra\u011f\u0131 kullan\n\t\t\tfmt.Println(\"--- Detayl\u0131 Bilgi (Verbose) ---\")\n\t\t\tfmt.Printf(\"Dizin mi?: %t\\n\", fileInfo.IsDir())\n\t\t\tfmt.Printf(\"Sistem Modu: %s\\n\", fileInfo.Mode().String())\n\t\t}\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(infoCmd) \/\/ infoCmd'yi ana komuta ekle\n}<\/code><\/pre>\n<p><strong>4. <code>cmd\/hash.go<\/code>:<\/strong> <code>hash<\/code> alt komutunu tan\u0131mlar. Bu komut, bir dosyan\u0131n MD5 \u00f6zetini hesaplar.<\/p>\n<pre><code class=\"language-go\">\/\/ cmd\/hash.go\npackage cmd\n\nimport (\n\t\"crypto\/md5\"\n\t\"encoding\/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com\/spf13\/cobra\"\n)\n\n\/\/ hashCmd, 'fileutil hash <dosya_yolu>' komutunu temsil eder.\nvar hashCmd = &cobra.Command{\n\tUse:   \"hash <dosya_yolu>\",\n\tShort: \"Bir dosyan\u0131n MD5 \u00f6zetini hesaplar\",\n\tLong: <code>Belirtilen dosyan\u0131n MD5 \u00f6zetini (checksum) hesaplar ve ekrana yazd\u0131r\u0131r.\nKullan\u0131m: fileutil hash <dosya_yolu><\/code>,\n\tArgs: cobra.ExactArgs(1), \/\/ Tam olarak 1 arg\u00fcman bekler (dosya yolu)\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tfilePath := args[0]\n\n\t\tfile, err := os.Open(filePath)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Hata: '%s' dosyas\u0131 bulunamad\u0131.\\n\", filePath)\n\t\t\t} else {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Hata: Dosya a\u00e7\u0131l\u0131rken bir sorun olu\u015ftu: %v\\n\", err)\n\t\t\t}\n\t\t\tos.Exit(1)\n\t\t}\n\t\tdefer file.Close() \/\/ Fonksiyon bitiminde dosyay\u0131 kapat\n\n\t\thash := md5.New()\n\t\tif _, err := io.Copy(hash, file); err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"Hata: Dosya okunurken bir sorun olu\u015ftu: %v\\n\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\n\t\thashInBytes := hash.Sum(nil)[:16]\n\t\tmd5String := hex.EncodeToString(hashInBytes)\n\n\t\tfmt.Printf(\"Dosya: %s\\n\", filePath)\n\t\tfmt.Printf(\"MD5 \u00d6zeti: %s\\n\", md5String)\n\n\t\tif verbose { \/\/ root komutunda tan\u0131mlanan global bayra\u011f\u0131 kullan\n\t\t\tfmt.Println(\"--- Detayl\u0131 Bilgi (Verbose) ---\")\n\t\t\tfmt.Println(\"MD5 algoritmas\u0131 kullan\u0131ld\u0131.\")\n\t\t}\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(hashCmd) \/\/ hashCmd'yi ana komuta ekle\n}<\/code><\/pre>\n<h4><code>fileutil<\/code> Arac\u0131n\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>\u015eimdi bu kodu derleyip \u00e7al\u0131\u015ft\u0131rabiliriz. \u00d6ncelikle, \u00f6rnek bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">echo \"Bu bir deneme dosyas\u0131d\u0131r.\" > test.txt<\/code><\/pre>\n<p>\u015eimdi arac\u0131m\u0131z\u0131 derleyelim:<\/p>\n<pre><code class=\"language-bash\">go build -o fileutil .<\/code><\/pre>\n<p>Ve \u00e7e\u015fitli komutlarla \u00e7al\u0131\u015ft\u0131ral\u0131m:<\/p>\n<pre><code class=\"language-bash\">.\/fileutil\n<h2>\u00c7\u0131kt\u0131: fileutil, Go ile olu\u015fturulmu\u015f basit bir komut sat\u0131r\u0131 arac\u0131d\u0131r.<\/h2>\n<h2>... (yard\u0131m mesaj\u0131)<\/h2>\n\n.\/fileutil info test.txt\n<h2>\u00c7\u0131kt\u0131:<\/h2>\n<h2>Dosya Ad\u0131: test.txt<\/h2>\n<h2>Boyut: 28 bayt<\/h2>\n<h2>Son De\u011fi\u015fiklik: ...<\/h2>\n<h2>\u0130zinler: -rw-rw-r-- (664)<\/h2>\n\n.\/fileutil info non_existent_file.txt\n<h2>\u00c7\u0131kt\u0131: Hata: 'non_existent_file.txt' dosyas\u0131 bulunamad\u0131.<\/h2>\n\n.\/fileutil hash test.txt\n<h2>\u00c7\u0131kt\u0131:<\/h2>\n<h2>Dosya: test.txt<\/h2>\n<h2>MD5 \u00d6zeti: 5316374972f10b3711d95015b7b9f8f4<\/h2>\n\n.\/fileutil info test.txt -v\n<h2>\u00c7\u0131kt\u0131: (Yukar\u0131daki info \u00e7\u0131kt\u0131s\u0131na ek olarak detayl\u0131 bilgi)<\/h2>\n<h2>...<\/h2>\n<h2>--- Detayl\u0131 Bilgi (Verbose) ---<\/h2>\n<h2>Dizin mi?: false<\/h2>\n<h2>Sistem Modu: -rw-rw-r--<\/code><\/pre>\n<\/h2>\n<p>Bu \u00f6rnek, <code>cobra<\/code>&#8216;n\u0131n nas\u0131l alt komutlar tan\u0131mlad\u0131\u011f\u0131n\u0131, arg\u00fcmanlar\u0131 nas\u0131l i\u015fledi\u011fini ve global bayraklar\u0131 (<code>--verbose<\/code>) nas\u0131l kulland\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. <code>cobra.Command<\/code> yap\u0131s\u0131, <code>Use<\/code>, <code>Short<\/code>, <code>Long<\/code>, <code>Args<\/code> ve <code>Run<\/code> gibi alanlarla komutun davran\u0131\u015f\u0131n\u0131 kolayca yap\u0131land\u0131rman\u0131za olanak tan\u0131r. <code>init()<\/code> fonksiyonlar\u0131 ise alt komutlar\u0131 <code>rootCmd<\/code>&#8216;ye eklemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Hata Y\u00f6netimi ve Kullan\u0131c\u0131 Geribildirimi<\/h3>\n<p>Sa\u011flam bir CLI arac\u0131, hatalar\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmeli ve kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r geri bildirim sa\u011flamal\u0131d\u0131r. Go&#8217;da hata y\u00f6netimi genellikle fonksiyonlar\u0131n <code>error<\/code> t\u00fcr\u00fcnde bir de\u011fer d\u00f6nd\u00fcrmesiyle yap\u0131l\u0131r. CLI ara\u00e7lar\u0131nda, bir hata durumunda program\u0131n uygun bir \u00e7\u0131k\u0131\u015f koduyla (<code>os.Exit(1)<\/code>) sonland\u0131r\u0131lmas\u0131 \u00f6nemlidir. Bu, komut dosyalar\u0131n\u0131n (shell scripts) arac\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 anlamas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6rneklerimizde <code>fmt.Fprintf(os.Stderr, \"Hata: ...\")<\/code> kullanarak hata mesajlar\u0131n\u0131 standart hata ak\u0131\u015f\u0131na (stderr) yazd\u0131rd\u0131k. Bu, normal \u00e7\u0131kt\u0131dan (stdout) ayr\u0131 tutulmas\u0131 gereken bir iyi uygulamad\u0131r.<\/p>\n<p><code>cobra<\/code> ayr\u0131ca <code>cobra.CheckErr<\/code> gibi yard\u0131mc\u0131 fonksiyonlar sunar. Ancak genellikle <code>if err != nil<\/code> kal\u0131b\u0131 yeterlidir.<\/p>\n<h3>\u00c7\u0131kt\u0131 Bi\u00e7imlendirme<\/h3>\n<p>CLI ara\u00e7lar\u0131n\u0131n \u00e7\u0131kt\u0131s\u0131, kullan\u0131c\u0131 taraf\u0131ndan kolayca okunabilir ve programlar taraf\u0131ndan kolayca ayr\u0131\u015ft\u0131r\u0131labilir olmal\u0131d\u0131r.<br \/>\n*   <strong>\u0130nsan Okunabilir \u00c7\u0131kt\u0131:<\/strong> <code>fmt.Printf<\/code> veya <code>text\/tabwriter<\/code> gibi paketler, verileri s\u00fctunlar halinde hizalayarak okunabilirli\u011fi art\u0131r\u0131r.<br \/>\n*   <strong>Makine Okunabilir \u00c7\u0131kt\u0131:<\/strong> Baz\u0131 durumlarda, CLI arac\u0131n\u0131z\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 ba\u015fka bir program\u0131n i\u015flemesi gerekebilir. Bu durumda, JSON (<code>encoding\/json<\/code>) veya CSV gibi yap\u0131land\u0131r\u0131lm\u0131\u015f formatlar kullanmak faydal\u0131 olabilir. \u00d6rne\u011fin, <code>--json<\/code> bayra\u011f\u0131 ekleyerek \u00e7\u0131kt\u0131n\u0131n JSON format\u0131nda olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3>CLI Arac\u0131n\u0131z\u0131 Test Etme<\/h3>\n<p>CLI ara\u00e7lar\u0131 i\u00e7in test yazmak, di\u011fer Go programlar\u0131 i\u00e7in test yazmaya benzer.<br \/>\n*   <strong>Birim Testleri:<\/strong> Komutlar\u0131n\u0131z\u0131n arkas\u0131ndaki i\u015f mant\u0131\u011f\u0131n\u0131 (\u00f6rne\u011fin, bir dosyan\u0131n MD5 \u00f6zetini hesaplayan fonksiyon) ayr\u0131 ayr\u0131 test edin.<br \/>\n*   <strong>Entegrasyon Testleri:<\/strong> T\u00fcm CLI arac\u0131n\u0131n bekledi\u011finiz gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in <code>exec.Command<\/code> kullanarak komutlar\u0131 \u00e7al\u0131\u015ft\u0131rabilir ve \u00e7\u0131kt\u0131y\u0131 kontrol edebilirsiniz.<\/p>\n<p>\u00d6rne\u011fin, <code>fileutil hash<\/code> komutunu test etmek i\u00e7in:<\/p>\n<pre><code class=\"language-go\">\/\/ fileutil_test.go\npackage main_test\n\nimport (\n\t\"bytes\"\n\t\"io\/ioutil\"\n\t\"os\"\n\t\"os\/exec\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestFileUtilHashCommand(t *testing.T) {\n\t\/\/ Ge\u00e7ici bir dosya olu\u015ftur\n\ttestContent := \"Test i\u00e7eri\u011fi\"\n\ttmpFile, err := ioutil.TempFile(\"\", \"testfile*.txt\")\n\tif err != nil {\n\t\tt.Fatalf(\"Ge\u00e7ici dosya olu\u015fturulamad\u0131: %v\", err)\n\t}\n\tdefer os.Remove(tmpFile.Name()) \/\/ Test bitiminde dosyay\u0131 sil\n\n\tif _, err := tmpFile.WriteString(testContent); err != nil {\n\t\tt.Fatalf(\"Ge\u00e7ici dosyaya yaz\u0131lamad\u0131: %v\", err)\n\t}\n\ttmpFile.Close()\n\n\t\/\/ CLI arac\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\n\tcmd := exec.Command(\".\/fileutil\", \"hash\", tmpFile.Name())\n\tvar out bytes.Buffer\n\tcmd.Stdout = &out\n\terr = cmd.Run()\n\tif err != nil {\n\t\tt.Fatalf(\"fileutil hash komutu \u00e7al\u0131\u015f\u0131rken hata: %v\", err)\n\t}\n\n\t\/\/ \u00c7\u0131kt\u0131y\u0131 kontrol et\n\texpectedMD5 := \"f339178f0d8a0d9237c3525287515d01\" \/\/ \"Test i\u00e7eri\u011fi\" MD5'i\n\tif !strings.Contains(out.String(), expectedMD5) {\n\t\tt.Errorf(\"Beklenen MD5 \u00f6zeti '%s' \u00e7\u0131kt\u0131da bulunamad\u0131: %s\", expectedMD5, out.String())\n\t}\n}<\/code><\/pre>\n<p>Bu test, <code>fileutil<\/code> ikili dosyas\u0131n\u0131n olu\u015fturuldu\u011funu ve <code>go test<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131labilece\u011fini varsayar.<\/p>\n<h3>Arac\u0131n\u0131z\u0131 Derleme ve Da\u011f\u0131tma<\/h3>\n<p>Go&#8217;nun en b\u00fcy\u00fck avantajlar\u0131ndan biri, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren tek, statik olarak derlenmi\u015f bir ikili dosya \u00fcretmesidir. Bu, da\u011f\u0131t\u0131m\u0131 inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Derleme<\/h4>\n<p>Proje dizininizin k\u00f6k\u00fcnden a\u015fa\u011f\u0131daki komutla arac\u0131n\u0131z\u0131 derleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">go build -o fileutil .<\/code><\/pre>\n<p>Bu, bulundu\u011funuz i\u015fletim sistemi ve mimari i\u00e7in <code>fileutil<\/code> ad\u0131nda bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya olu\u015fturur.<\/p>\n<h4>\u00c7apraz Derleme (Cross-Compilation)<\/h4>\n<p>Go, farkl\u0131 i\u015fletim sistemleri ve mimariler i\u00e7in kolayca \u00e7apraz derleme yapman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, Linux \u00fczerinde Windows i\u00e7in bir ikili dosya olu\u015fturmak isterseniz:<\/p>\n<pre><code class=\"language-bash\">GOOS=windows GOARCH=amd64 go build -o fileutil.exe .<\/code><\/pre>\n<p>MacOS i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">GOOS=darwin GOARCH=amd64 go build -o fileutil_mac .<\/code><\/pre>\n<p>Bu, Go&#8217;nun &#8220;bir kez yaz, her yerde \u00e7al\u0131\u015ft\u0131r&#8221; felsefesinin g\u00fc\u00e7l\u00fc bir g\u00f6stergesidir.<\/p>\n<h4>Da\u011f\u0131t\u0131m<\/h4>\n<p>Derlenmi\u015f ikili dosyay\u0131 kullan\u0131c\u0131lar\u0131n\u0131za do\u011frudan verebilirsiniz. Kullan\u0131c\u0131lar\u0131n Go kurulu olmas\u0131na gerek yoktur. Genellikle, bu ikili dosyay\u0131 sistemlerinin <code>PATH<\/code> ortam de\u011fi\u015fkeninde tan\u0131ml\u0131 bir dizine (\u00f6rne\u011fin <code>\/usr\/local\/bin<\/code> veya <code>~\/bin<\/code>) kopyalamalar\u0131 yeterlidir, b\u00f6ylece komutu do\u011frudan terminalden \u00e7al\u0131\u015ft\u0131rabilirler.<\/p>\n<p>Daha geli\u015fmi\u015f da\u011f\u0131t\u0131m senaryolar\u0131 i\u00e7in <code>goreleaser<\/code> gibi ara\u00e7lar, otomatik olarak farkl\u0131 platformlar i\u00e7in ikili dosyalar olu\u015fturabilir, s\u0131k\u0131\u015ft\u0131rabilir, GitHub s\u00fcr\u00fcmlerine y\u00fckleyebilir ve paket y\u00f6neticileri i\u00e7in paketler (Homebrew, Scoop vb.) olu\u015fturabilir.<\/p>\n<h3>Geli\u015fmi\u015f Konulara K\u0131sa Bir Bak\u0131\u015f<\/h3>\n<p>Bu makalede temel bir CLI arac\u0131 olu\u015fturmay\u0131 \u00f6\u011frendik, ancak Go ve <code>cobra<\/code> ekosistemi daha bir\u00e7ok geli\u015fmi\u015f \u00f6zellik sunar:<\/p>\n<p>*   <strong>Yap\u0131land\u0131rma Y\u00f6netimi (<code>viper<\/code>):<\/strong> <code>spf13\/viper<\/code> k\u00fct\u00fcphanesi, CLI ara\u00e7lar\u0131n\u0131z i\u00e7in yap\u0131land\u0131rma dosyalar\u0131n\u0131 (JSON, YAML, TOML, INI), ortam de\u011fi\u015fkenlerini ve komut sat\u0131r\u0131 bayraklar\u0131n\u0131 tutarl\u0131 bir \u015fekilde y\u00f6netmenizi sa\u011flar.<br \/>\n*   <strong>Etkile\u015fimli \u0130stekler (<code>survey<\/code>):<\/strong> Kullan\u0131c\u0131dan girdi almak i\u00e7in interaktif men\u00fcler, onay kutular\u0131 veya metin giri\u015f alanlar\u0131 sa\u011flamak isterseniz, <code>AlecAivazis\/survey<\/code> gibi k\u00fct\u00fcphaneler yard\u0131mc\u0131 olabilir.<br \/>\n*   <strong>\u0130lerleme \u00c7ubuklar\u0131 (<code>go-progress<\/code>):<\/strong> Uzun s\u00fcren i\u015flemler i\u00e7in kullan\u0131c\u0131ya geri bildirim sa\u011flamak amac\u0131yla ilerleme \u00e7ubuklar\u0131 g\u00f6sterebilirsiniz.<br \/>\n*   <strong>G\u00fcnl\u00fckleme (<code>zap<\/code>, <code>logrus<\/code>):<\/strong> Basit <code>fmt.Println<\/code> yerine, daha geli\u015fmi\u015f ve yap\u0131land\u0131r\u0131labilir g\u00fcnl\u00fckleme i\u00e7in <code>uber-go\/zap<\/code> veya <code>sirupsen\/logrus<\/code> gibi k\u00fct\u00fcphaneler kullanabilirsiniz.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu:<\/strong> Daha b\u00fcy\u00fck projelerde kodun test edilebilirli\u011fini ve bak\u0131m\u0131n\u0131 art\u0131rmak i\u00e7in ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu desenlerini uygulayabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Go, komut sat\u0131r\u0131 ara\u00e7lar\u0131 geli\u015ftirmek i\u00e7in ola\u011fan\u00fcst\u00fc bir dildir. Performans\u0131, tek ikili dosya olu\u015fturma yetene\u011fi ve zengin standart k\u00fct\u00fcphanesi sayesinde, geli\u015ftiricilere g\u00fc\u00e7l\u00fc ve da\u011f\u0131t\u0131m\u0131 kolay ara\u00e7lar yaratma imkan\u0131 sunar. Bu makalede, <code>os.Args<\/code> ile temel arg\u00fcman i\u015fleminden ba\u015flayarak, <code>flag<\/code> paketi ile bayrak y\u00f6netimine ve son olarak <code>cobra<\/code> k\u00fct\u00fcphanesi ile alt komutlara sahip, profesyonel d\u00fczeyde bir CLI arac\u0131 olu\u015fturmaya kadar Go&#8217;nun CLI geli\u015ftirme yeteneklerini ke\u015ffettik.<\/p>\n<p>Art\u0131k kendi Go CLI ara\u00e7lar\u0131n\u0131z\u0131 olu\u015fturmak i\u00e7in sa\u011flam bir temele sahipsiniz. Kendi ihtiya\u00e7lar\u0131n\u0131za uygun otomasyon ara\u00e7lar\u0131, sistem yard\u0131mc\u0131lar\u0131 veya veri i\u015fleme programlar\u0131 geli\u015ftirerek Go&#8217;nun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye devam edin. Unutmay\u0131n, pratik yapmak en iyi \u00f6\u011frenme y\u00f6ntemidir. K\u00fc\u00e7\u00fck projelerle ba\u015flay\u0131n, hatalar yap\u0131n ve onlardan ders \u00e7\u0131kar\u0131n. Go toplulu\u011fu ve zengin dok\u00fcmantasyon, bu yolculukta size her zaman destek olacakt\u0131r. Ba\u015far\u0131lar dileriz!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma\nGiri\u015f: Komut Sat\u0131r\u0131 Ara\u00e7lar\u0131n\u0131n G\u00fcc\u00fc\nKomut sat\u0131r\u0131 ara\u00e7lar\u0131 (CLI &#8211; Command Line Interf","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32392","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma Giri\u015f: Komut Sat\u0131r\u0131 Ara\u00e7lar\u0131n\u0131n G\u00fcc\u00fc Komut sat\u0131r\u0131 ara\u00e7lar\u0131 (CLI - Command Line Interf\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-21T03:41:01+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma\",\"datePublished\":\"2025-10-21T03:41:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\"},\"wordCount\":2117,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\",\"name\":\"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-21T03:41:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma","og_description":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma Giri\u015f: Komut Sat\u0131r\u0131 Ara\u00e7lar\u0131n\u0131n G\u00fcc\u00fc Komut sat\u0131r\u0131 ara\u00e7lar\u0131 (CLI - Command Line Interf","og_url":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-21T03:41:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma","datePublished":"2025-10-21T03:41:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/"},"wordCount":2117,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/","name":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-21T03:41:01+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-ilk-komut-satiri-aracinizi-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go ile \u0130lk Komut Sat\u0131r\u0131 Arac\u0131n\u0131z\u0131 Olu\u015fturma"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32392"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32392\/revisions"}],"predecessor-version":[{"id":32393,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32392\/revisions\/32393"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}