{"id":33293,"date":"2025-11-01T05:41:02","date_gmt":"2025-11-01T02:41:02","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33293"},"modified":"2025-11-01T05:41:02","modified_gmt":"2025-11-01T02:41:02","slug":"goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/","title":{"rendered":"Go&#8217;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek"},"content":{"rendered":"<p><body><\/p>\n<h2>Go&#8217;da <code>flag<\/code> Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Go programlama dili, uygulamalar\u0131n komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 kolayca ayr\u0131\u015ft\u0131rmas\u0131 ve y\u00f6netmesi i\u00e7in standart k\u00fct\u00fcphanesinde g\u00fc\u00e7l\u00fc ve kullan\u0131m\u0131 basit bir paket olan <code>flag<\/code> paketini sunar. Modern uygulamalar\u0131n \u00e7o\u011fu, kullan\u0131c\u0131dan veya otomasyon sistemlerinden gelen girdileri i\u015flemek i\u00e7in komut sat\u0131r\u0131 arg\u00fcmanlar\u0131na ihtiya\u00e7 duyar. Bu arg\u00fcmanlar genellikle yap\u0131land\u0131rma ayarlar\u0131n\u0131 (\u00f6rne\u011fin, veritaban\u0131 ba\u011flant\u0131 dizeleri), \u00e7al\u0131\u015fma zaman\u0131 se\u00e7eneklerini (\u00f6rne\u011fin, hata ay\u0131klama modu) veya belirli g\u00f6revleri (\u00f6rne\u011fin, dosya yollar\u0131) belirtmek i\u00e7in kullan\u0131l\u0131r. <code>flag<\/code> paketi, bu t\u00fcr girdileri tan\u0131mlaman\u0131za, varsay\u0131lan de\u011ferler ataman\u0131za, a\u00e7\u0131klamalar eklemenize ve program\u0131n\u0131z\u0131n bu arg\u00fcmanlar\u0131 g\u00fcvenli bir \u015fekilde ayr\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131r.<\/p>\n<p>Bu makalede, <code>flag<\/code> paketinin temelden ileri seviyeye kadar nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ayr\u0131nt\u0131l\u0131 olarak inceleyece\u011fiz. De\u011fi\u015fken t\u00fcrlerine g\u00f6re bayrak tan\u0131mlamadan, \u00f6zel bayrak t\u00fcrleri olu\u015fturmaya, hata y\u00f6netimine ve alt komutlar i\u00e7in <code>FlagSet<\/code> kullan\u0131m\u0131na kadar bir\u00e7ok konuyu ele alaca\u011f\u0131z. Amac\u0131m\u0131z, Go projelerinizde komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 etkin bir \u015fekilde y\u00f6netmek i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri size sunmakt\u0131r.<\/p>\n<h2>Temel Kullan\u0131m<\/h2>\n<p><code>flag<\/code> paketini kullanmaya ba\u015flamak olduk\u00e7a basittir. \u0130lk ad\u0131m, program\u0131n\u0131z\u0131n bekledi\u011fi bayraklar\u0131 (arg\u00fcmanlar\u0131) tan\u0131mlamak ve ard\u0131ndan bu bayraklar\u0131 ayr\u0131\u015ft\u0131rmak i\u00e7in <code>flag.Parse()<\/code> fonksiyonunu \u00e7a\u011f\u0131rmakt\u0131r.<\/p>\n<h3>De\u011fi\u015fken Tan\u0131mlama ve Bayrak Ba\u011flama<\/h3>\n<p><code>flag<\/code> paketi, farkl\u0131 veri t\u00fcrleri i\u00e7in bayraklar tan\u0131mlaman\u0131za olanak tan\u0131yan bir dizi fonksiyon sunar. En yayg\u0131n kullan\u0131lanlar <code>flag.String<\/code>, <code>flag.Int<\/code> ve <code>flag.Bool<\/code>&#8216;dur. Bu fonksiyonlar, bir bayrak tan\u0131mlar ve bu bayra\u011f\u0131n de\u011ferini tutacak bir de\u011fi\u015fkenin i\u015faret\u00e7isini (pointer) d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Her bir fonksiyon genellikle d\u00f6rt arg\u00fcman al\u0131r:<\/p>\n<ol>\n<li>Bayra\u011f\u0131n ad\u0131 (\u00f6rne\u011fin, &#8220;name&#8221;, &#8220;port&#8221;, &#8220;verbose&#8221;).<\/li>\n<li>Bayra\u011f\u0131n varsay\u0131lan de\u011feri. Kullan\u0131c\u0131 bu bayra\u011f\u0131 belirtmezse kullan\u0131lacak de\u011fer budur.<\/li>\n<li>Bayra\u011f\u0131n k\u0131sa a\u00e7\u0131klamas\u0131. Bu a\u00e7\u0131klama, <code>flag.PrintDefaults()<\/code> veya <code>-h<\/code>\/<code>--help<\/code> ile otomatik olarak olu\u015fturulan kullan\u0131m mesaj\u0131nda g\u00f6sterilir.<\/li>\n<\/ol>\n<p>\u0130\u015fte basit bir \u00f6rnek:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\t\/\/ String tipi bir bayrak tan\u0131mlama\n\tname := flag.String(\"name\", \"D\u00fcnya\", \"Selam verilecek isim\")\n\n\t\/\/ Integer tipi bir bayrak tan\u0131mlama\n\tport := flag.Int(\"port\", 8080, \"Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 port numaras\u0131\")\n\n\t\/\/ Boolean tipi bir bayrak tan\u0131mlama\n\tverbose := flag.Bool(\"verbose\", false, \"Detayl\u0131 \u00e7\u0131kt\u0131 g\u00f6stermek i\u00e7in\")\n\n\t\/\/ flag.Parse() \u00e7a\u011fr\u0131lmadan \u00f6nce bayraklar\u0131n varsay\u0131lan de\u011ferleri vard\u0131r.\n\tfmt.Printf(\"Ba\u015flang\u0131\u00e7 de\u011ferleri: name=%s, port=%d, verbose=%t\\n\", <em>name, <\/em>port, *verbose)\n\n\t\/\/ Bayraklar\u0131 ayr\u0131\u015ft\u0131rma (komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 i\u015fleme)\n\tflag.Parse()\n\n\t\/\/ flag.Parse() \u00e7a\u011fr\u0131ld\u0131ktan sonra bayraklar\u0131n de\u011ferlerine eri\u015febiliriz.\n\t\/\/ D\u00f6nd\u00fcr\u00fclen i\u015faret\u00e7iyi (pointer) dereference etmeyi unutmay\u0131n.\n\tfmt.Printf(\"Merhaba, %s! Uygulama %d portunda \u00e7al\u0131\u015f\u0131yor. Detayl\u0131 mod: %t\\n\", <em>name, <\/em>port, *verbose)\n}\n<\/code><\/pre>\n<p>Bu kodu derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda:<\/p>\n<ul>\n<li><code>go run main.go<\/code>: <code>Merhaba, D\u00fcnya! Uygulama 8080 portunda \u00e7al\u0131\u015f\u0131yor. Detayl\u0131 mod: false<\/code><\/li>\n<li><code>go run main.go --name \"Go Programc\u0131s\u0131\" --port 9000 -verbose<\/code>: <code>Merhaba, Go Programc\u0131s\u0131! Uygulama 9000 portunda \u00e7al\u0131\u015f\u0131yor. Detayl\u0131 mod: true<\/code><\/li>\n<li><code>go run main.go -h<\/code>: Tan\u0131mlad\u0131\u011f\u0131n\u0131z bayraklar\u0131n a\u00e7\u0131klamalar\u0131yla birlikte bir kullan\u0131m mesaj\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz.<\/li>\n<\/ul>\n<p>Alternatif olarak, mevcut bir de\u011fi\u015fkeni bayra\u011fa ba\u011flamak i\u00e7in <code>flag.StringVar<\/code>, <code>flag.IntVar<\/code>, <code>flag.BoolVar<\/code> gibi fonksiyonlar\u0131 kullanabilirsiniz. Bu, \u00f6zellikle yap\u0131land\u0131rma nesneleriyle \u00e7al\u0131\u015f\u0131rken faydal\u0131 olabilir:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar name string\n\tvar port int\n\tvar verbose bool\n\n\tflag.StringVar(&name, \"name\", \"D\u00fcnya\", \"Selam verilecek isim\")\n\tflag.IntVar(&port, \"port\", 8080, \"Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 port numaras\u0131\")\n\tflag.BoolVar(&verbose, \"verbose\", false, \"Detayl\u0131 \u00e7\u0131kt\u0131 g\u00f6stermek i\u00e7in\")\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Merhaba, %s! Uygulama %d portunda \u00e7al\u0131\u015f\u0131yor. Detayl\u0131 mod: %t\\n\", name, port, verbose)\n}\n<\/code><\/pre>\n<p>Her iki y\u00f6ntem de ayn\u0131 sonucu verir; tercih genellikle ki\u015fisel kodlama stiline veya mevcut de\u011fi\u015fken yap\u0131s\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<h3>Bayraklar\u0131 Ayr\u0131\u015ft\u0131rma (<code>flag.Parse()<\/code>)<\/h3>\n<p><code>flag.Parse()<\/code> fonksiyonu, <code>flag<\/code> paketinin kalbidir. Bu fonksiyon, komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 tarar, tan\u0131mlanm\u0131\u015f bayraklar\u0131 bulur ve kar\u015f\u0131l\u0131k gelen de\u011fi\u015fkenlerin de\u011ferlerini g\u00fcnceller. <strong>T\u00fcm bayrak tan\u0131mlamalar\u0131 yap\u0131ld\u0131ktan sonra ve bayrak de\u011ferlerine eri\u015fmeden \u00f6nce <code>flag.Parse()<\/code> \u00e7a\u011fr\u0131lmal\u0131d\u0131r.<\/strong> E\u011fer <code>flag.Parse()<\/code> \u00e7a\u011fr\u0131lmazsa, bayrak de\u011fi\u015fkenleri varsay\u0131lan de\u011ferlerini korur ve komut sat\u0131r\u0131nda belirtilen de\u011ferler dikkate al\u0131nmaz.<\/p>\n<p><code>flag.Parse()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, <code>os.Args<\/code> dilimini (slice) ayr\u0131\u015ft\u0131rmaya ba\u015flar. <code>os.Args[0]<\/code> program\u0131n ad\u0131d\u0131r ve <code>flag<\/code> paketi bunu g\u00f6z ard\u0131 eder. Kalan arg\u00fcmanlar, tan\u0131mlanm\u0131\u015f bayraklarla e\u015fle\u015ftirilir. E\u011fer bilinmeyen bir bayrak veya ge\u00e7ersiz bir de\u011fer format\u0131 ile kar\u015f\u0131la\u015f\u0131l\u0131rsa, <code>flag<\/code> paketi varsay\u0131lan olarak bir hata mesaj\u0131 yazd\u0131r\u0131r ve programdan <code>os.Exit(2)<\/code> ile \u00e7\u0131kar. Bu davran\u0131\u015f <code>flag.Usage<\/code> de\u011fi\u015fkeni \u00f6zelle\u015ftirilerek de\u011fi\u015ftirilebilir.<\/p>\n<p><code>flag.Parse()<\/code> fonksiyonundan sonra, bayraklar taraf\u0131ndan i\u015flenmeyen t\u00fcm kalan komut sat\u0131r\u0131 arg\u00fcmanlar\u0131na <code>flag.Args()<\/code> fonksiyonu ile eri\u015filebilir. Bu, \u00f6zellikle bir komutun hem bayraklar\u0131 hem de pozisyonel arg\u00fcmanlar\u0131 (\u00f6rne\u011fin, dosya adlar\u0131 veya kimlikler) kabul etti\u011fi senaryolarda kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tname := flag.String(\"name\", \"Anonim\", \"\u0130\u015flem yapacak ki\u015finin ad\u0131\")\n\t\n\tflag.Parse()\n\n\tfmt.Printf(\"\u0130\u015flem yapan: %s\\n\", *name)\n\n\t\/\/ Kalan arg\u00fcmanlara eri\u015fim\n\tif flag.NArg() > 0 {\n\t\tfmt.Println(\"Kalan arg\u00fcmanlar:\")\n\t\tfor i, arg := range flag.Args() {\n\t\t\tfmt.Printf(\"  %d: %s\\n\", i+1, arg)\n\t\t}\n\t} else {\n\t\tfmt.Println(\"Hi\u00e7 kalan arg\u00fcman yok.\")\n\t}\n}\n<\/code><\/pre>\n<p>\u00c7al\u0131\u015ft\u0131rma \u00f6rnekleri:<\/p>\n<ul>\n<li><code>go run main.go<\/code>: <code>\u0130\u015flem yapan: Anonim<\/code>, <code>Hi\u00e7 kalan arg\u00fcman yok.<\/code><\/li>\n<li><code>go run main.go --name \"Alice\"<\/code>: <code>\u0130\u015flem yapan: Alice<\/code>, <code>Hi\u00e7 kalan arg\u00fcman yok.<\/code><\/li>\n<li><code>go run main.go file1.txt file2.txt --name \"Bob\"<\/code>: <code>\u0130\u015flem yapan: Bob<\/code>, <code>Kalan arg\u00fcmanlar: 1: file1.txt, 2: file2.txt<\/code> (Bayraklar her zaman arg\u00fcmanlardan \u00f6nce gelmeli, aksi takdirde bayrak olmayanlar arg\u00fcman olarak alg\u0131lan\u0131r. Do\u011frusu: <code>go run main.go --name \"Bob\" file1.txt file2.txt<\/code>)<\/li>\n<\/ul>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>flag.Parse()<\/code> t\u00fcm bayraklar\u0131 i\u015fler ve ard\u0131ndan kalan her \u015feyi <code>flag.Args()<\/code>&#8216;a b\u0131rak\u0131r.<\/p>\n<h2>Bayrak T\u00fcrleri ve Kullan\u0131m Senaryolar\u0131<\/h2>\n<p><code>flag<\/code> paketi, Go&#8217;nun temel veri t\u00fcrlerine kar\u015f\u0131l\u0131k gelen bir\u00e7ok haz\u0131r bayrak t\u00fcr\u00fc sunar. Ayr\u0131ca, \u00f6zel veri t\u00fcrleriniz i\u00e7in kendi bayrak t\u00fcrlerinizi de tan\u0131mlayabilirsiniz.<\/p>\n<h3>String Bayraklar\u0131<\/h3>\n<p>En s\u0131k kullan\u0131lan bayrak t\u00fcrlerinden biridir. Metin tabanl\u0131 girdiler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<ul>\n<li><code>flag.String(name string, value string, usage string) *string<\/code>: Yeni bir string bayrak tan\u0131mlar ve varsay\u0131lan de\u011feriyle birlikte bir i\u015faret\u00e7i d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>flag.StringVar(p *string, name string, value string, usage string)<\/code>: Mevcut bir string de\u011fi\u015fkenini bir bayra\u011fa ba\u011flar.<\/li>\n<\/ul>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar configPath string\n\tflag.StringVar(&configPath, \"config\", \"\/etc\/app\/config.json\", \"Uygulama yap\u0131land\u0131rma dosyas\u0131n\u0131n yolu\")\n\n\tlogLevel := flag.String(\"log-level\", \"info\", \"Uygulama g\u00fcnl\u00fck seviyesi (debug, info, warn, error)\")\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Yap\u0131land\u0131rma dosyas\u0131: %s\\n\", configPath)\n\tfmt.Printf(\"G\u00fcnl\u00fck seviyesi: %s\\n\", *logLevel)\n}\n<\/code><\/pre>\n<p>Kullan\u0131m: <code>go run main.go --config \/opt\/app\/myconfig.json --log-level debug<\/code><\/p>\n<h3>Integer Bayraklar\u0131<\/h3>\n<p>Say\u0131sal de\u011ferler i\u00e7in kullan\u0131l\u0131r. <code>int<\/code>, <code>int64<\/code>, <code>uint<\/code>, <code>uint64<\/code> gibi farkl\u0131 tam say\u0131 t\u00fcrleri i\u00e7in fonksiyonlar mevcuttur.<\/p>\n<ul>\n<li><code>flag.Int(name string, value int, usage string) *int<\/code><\/li>\n<li><code>flag.IntVar(p *int, name string, value int, usage string)<\/code><\/li>\n<li>Benzer \u015fekilde <code>flag.Int64<\/code>, <code>flag.IntVar64<\/code>, <code>flag.Uint<\/code>, <code>flag.UintVar<\/code>, <code>flag.Uint64<\/code>, <code>flag.UintVar64<\/code> fonksiyonlar\u0131 da bulunur.<\/li>\n<\/ul>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tmaxWorkers := flag.Int(\"workers\", 4, \"Ayn\u0131 anda \u00e7al\u0131\u015facak maksimum i\u015f\u00e7i say\u0131s\u0131\")\n\ttimeoutSeconds := flag.Uint(\"timeout\", 30, \"\u0130\u015flemler i\u00e7in saniye cinsinden zaman a\u015f\u0131m\u0131\")\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Maksimum i\u015f\u00e7i say\u0131s\u0131: %d\\n\", *maxWorkers)\n\tfmt.Printf(\"Zaman a\u015f\u0131m\u0131 (saniye): %d\\n\", *timeoutSeconds)\n}\n<\/code><\/pre>\n<p>Kullan\u0131m: <code>go run main.go --workers 8 --timeout 60<\/code><\/p>\n<h3>Boolean Bayraklar\u0131<\/h3>\n<p>Genellikle bir \u00f6zelli\u011fin a\u00e7\u0131l\u0131p kapanmas\u0131 gibi ikili durumlar i\u00e7in kullan\u0131l\u0131r (<code>true<\/code>\/<code>false<\/code>).<\/p>\n<ul>\n<li><code>flag.Bool(name string, value bool, usage string) *bool<\/code><\/li>\n<li><code>flag.BoolVar(p *bool, name string, value bool, usage string)<\/code><\/li>\n<\/ul>\n<p>Boolean bayraklar \u00f6zel bir \u015fekilde i\u015flenir:<\/p>\n<ul>\n<li><code>--flagname<\/code> veya <code>-flagname<\/code>: Varsay\u0131lan de\u011feri <code>false<\/code> ise <code>true<\/code> yapar.<\/li>\n<li><code>--flagname=true<\/code> veya <code>--flagname=false<\/code>: De\u011feri a\u00e7\u0131k\u00e7a belirtir.<\/li>\n<li><code>--flagname true<\/code> (bo\u015fluklu): Bu kullan\u0131m <code>flag<\/code> paketi i\u00e7in ge\u00e7erli de\u011fildir.<\/li>\n<\/ul>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tdebugMode := flag.Bool(\"debug\", false, \"Hata ay\u0131klama modunu etkinle\u015ftirir\")\n\tdryRun := flag.Bool(\"dry-run\", false, \"Ger\u00e7ek de\u011fi\u015fiklikler yapmadan i\u015flemi sim\u00fcle eder\")\n\n\tflag.Parse()\n\n\tif *debugMode {\n\t\tfmt.Println(\"Hata ay\u0131klama modu etkin.\")\n\t}\n\tif *dryRun {\n\t\tfmt.Println(\"Deneme \u00e7al\u0131\u015ft\u0131rmas\u0131 etkin. Ger\u00e7ek de\u011fi\u015fiklikler yap\u0131lmayacak.\")\n\t}\n}\n<\/code><\/pre>\n<p>Kullan\u0131m:<\/p>\n<ul>\n<li><code>go run main.go --debug<\/code>: <code>Hata ay\u0131klama modu etkin.<\/code><\/li>\n<li><code>go run main.go --debug=true --dry-run=false<\/code>: <code>Hata ay\u0131klama modu etkin.<\/code><\/li>\n<li><code>go run main.go -dry-run<\/code>: <code>Deneme \u00e7al\u0131\u015ft\u0131rmas\u0131 etkin. Ger\u00e7ek de\u011fi\u015fiklikler yap\u0131lmayacak.<\/code><\/li>\n<\/ul>\n<h3>S\u00fcre (Duration) Bayraklar\u0131<\/h3>\n<p><code>time.Duration<\/code> tipi i\u00e7in bayraklar tan\u0131mlaman\u0131za olanak tan\u0131r. S\u00fcre de\u011ferleri, &#8220;1s&#8221;, &#8220;10m&#8221;, &#8220;1h30m&#8221; gibi Go&#8217;nun <code>time.ParseDuration<\/code> format\u0131nda belirtilir.<\/p>\n<ul>\n<li><code>flag.Duration(name string, value time.Duration, usage string) *time.Duration<\/code><\/li>\n<li><code>flag.DurationVar(p *time.Duration, name string, value time.Duration, usage string)<\/code><\/li>\n<\/ul>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\trefreshInterval := flag.Duration(\"interval\", 5*time.Second, \"Yenileme aral\u0131\u011f\u0131 (\u00f6rn: 1s, 30m, 2h)\")\n\t\n\tflag.Parse()\n\n\tfmt.Printf(\"Veriler her %s'de bir yenilenecek.\\n\", *refreshInterval)\n}\n<\/code><\/pre>\n<p>Kullan\u0131m: <code>go run main.go --interval 1m30s<\/code> (1 dakika 30 saniye)<\/p>\n<h3>\u00d6zel Bayrak T\u00fcrleri (<code>flag.Value<\/code> Aray\u00fcz\u00fc)<\/h3>\n<p><code>flag<\/code> paketi, <code>flag.Value<\/code> aray\u00fcz\u00fcn\u00fc uygulayarak kendi \u00f6zel bayrak t\u00fcrlerinizi tan\u0131mlaman\u0131za olanak tan\u0131r. Bu aray\u00fcz iki metot gerektirir:<\/p>\n<ul>\n<li><code>Set(string) error<\/code>: Bir string de\u011feri alarak bayra\u011f\u0131n de\u011ferini ayarlar. Ayr\u0131\u015ft\u0131rma s\u0131ras\u0131nda kullan\u0131l\u0131r.<\/li>\n<li><code>String() string<\/code>: Bayra\u011f\u0131n mevcut de\u011ferini string olarak d\u00f6nd\u00fcr\u00fcr. Varsay\u0131lan de\u011ferler ve kullan\u0131m mesajlar\u0131 i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Bu, \u00f6zellikle virg\u00fclle ayr\u0131lm\u0131\u015f listeler, \u00f6zel yap\u0131land\u0131r\u0131lm\u0131\u015f stringler veya karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 do\u011frudan komut sat\u0131r\u0131ndan almak istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>\u00d6rnek: Virg\u00fclle ayr\u0131lm\u0131\u015f bir string listesini ayr\u0131\u015ft\u0131rmak i\u00e7in \u00f6zel bir bayrak:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n\/\/ stringList, virg\u00fclle ayr\u0131lm\u0131\u015f stringlerin listesini tutar.\ntype stringList []string\n\n\/\/ String metodu, stringList'i string olarak temsil eder.\nfunc (s *stringList) String() string {\n\treturn strings.Join(*s, \",\")\n}\n\n\/\/ Set metodu, string de\u011feri al\u0131p listeye ekler.\nfunc (s *stringList) Set(value string) error {\n\t*s = strings.Split(value, \",\")\n\treturn nil\n}\n\nfunc main() {\n\tvar tags stringList\n\t\/\/ \u00d6zel bayra\u011f\u0131 tan\u0131mlamak i\u00e7in flag.Var() kullan\u0131l\u0131r.\n\tflag.Var(&tags, \"tags\", \"Virg\u00fclle ayr\u0131lm\u0131\u015f etiketler listesi\")\n\n\tvar userIDs stringList\n\tflag.Var(&userIDs, \"users\", \"Virg\u00fclle ayr\u0131lm\u0131\u015f kullan\u0131c\u0131 ID'leri\")\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Etiketler: %v\\n\", tags)\n\tfmt.Printf(\"Kullan\u0131c\u0131 ID'leri: %v\\n\", userIDs)\n}\n<\/code><\/pre>\n<p>Kullan\u0131m: <code>go run main.go --tags \"go,programming,cli\" --users \"101,205,330\"<\/code><\/p>\n<p>Bu \u00f6rnekte, <code>stringList<\/code> tipi <code>flag.Value<\/code> aray\u00fcz\u00fcn\u00fc uygulad\u0131\u011f\u0131 i\u00e7in, <code>flag.Var()<\/code> fonksiyonu ile do\u011frudan bir bayrak olarak kullan\u0131labilir. Bu, <code>flag<\/code> paketinin esnekli\u011fini g\u00f6steren g\u00fc\u00e7l\u00fc bir \u00f6zelliktir.<\/p>\n<h2>Geli\u015fmi\u015f Kullan\u0131m ve \u0130pu\u00e7lar\u0131<\/h2>\n<p><code>flag<\/code> paketi, temel kullan\u0131m\u0131n \u00f6tesinde, daha karma\u015f\u0131k senaryolar\u0131 y\u00f6netmek i\u00e7in de \u00f6zellikler sunar.<\/p>\n<h3>Hata Y\u00f6netimi ve Kullan\u0131m Mesajlar\u0131<\/h3>\n<p>Yanl\u0131\u015f bir bayrak ad\u0131 veya ge\u00e7ersiz bir bayrak de\u011feri belirtildi\u011finde, <code>flag<\/code> paketi varsay\u0131lan olarak bir hata mesaj\u0131 yazd\u0131r\u0131r ve programdan \u00e7\u0131kar. Bu davran\u0131\u015f genellikle istenen bir durum olsa da, bazen \u00f6zelle\u015ftirmek isteyebilirsiniz.<\/p>\n<p>Varsay\u0131lan kullan\u0131m mesaj\u0131n\u0131 (usage message) \u00f6zelle\u015ftirmek i\u00e7in <code>flag.Usage<\/code> de\u011fi\u015fkenine kendi fonksiyonunuzu atayabilirsiniz:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\tname := flag.String(\"name\", \"Anonim\", \"Selam verilecek isim\")\n\tport := flag.Int(\"port\", 8080, \"Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 port numaras\u0131\")\n\n\t\/\/ flag.Usage'\u0131 \u00f6zelle\u015ftirme\n\tflag.Usage = func() {\n\t\tfmt.Fprintf(os.Stderr, \"Kullan\u0131m: %s [se\u00e7enekler] [arg\u00fcmanlar...]\\n\", os.Args[0])\n\t\tfmt.Fprintln(os.Stderr, \"Bu uygulama basit bir selamlay\u0131c\u0131d\u0131r.\")\n\t\tfmt.Fprintln(os.Stderr, \"Se\u00e7enekler:\")\n\t\tflag.PrintDefaults() \/\/ Tan\u0131mlanm\u0131\u015f t\u00fcm bayraklar\u0131n varsay\u0131lanlar\u0131n\u0131 yazd\u0131r\u0131r\n\t\tfmt.Fprintln(os.Stderr, \"\\n\u00d6rnek: myapp --name \\\"Ali\\\" --port 9000 file.txt\")\n\t}\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Merhaba, %s! Uygulama %d portunda \u00e7al\u0131\u015f\u0131yor.\\n\", <em>name, <\/em>port)\n\tif flag.NArg() > 0 {\n\t\tfmt.Printf(\"\u0130\u015flenecek dosyalar: %v\\n\", flag.Args())\n\t}\n}\n<\/code><\/pre>\n<p>\u015eimdi <code>go run main.go -h<\/code> veya ge\u00e7ersiz bir bayrak belirtildi\u011finde, kendi \u00f6zel kullan\u0131m mesaj\u0131n\u0131z g\u00f6sterilecektir.<\/p>\n<p>Ayr\u0131ca, <code>flag<\/code> paketi hata durumunda programdan \u00e7\u0131kmak yerine bir hata d\u00f6nd\u00fcrmesi i\u00e7in <code>flag.ExitOnError<\/code> yerine <code>flag.ContinueOnError<\/code> veya <code>flag.PanicOnError<\/code> se\u00e7eneklerini kullanabilirsiniz. Bu se\u00e7enekler <code>flag.FlagSet<\/code> yap\u0131s\u0131n\u0131n bir par\u00e7as\u0131d\u0131r, ancak varsay\u0131lan <code>flag.CommandLine<\/code> i\u00e7in de ayarlanabilir:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\t\/\/ Hata durumunda programdan \u00e7\u0131kmak yerine hata d\u00f6nd\u00fcrmesini sa\u011flar\u0131z.\n\tflag.CommandLine.SetOutput(os.Stdout) \/\/ Hata mesajlar\u0131n\u0131 stdout'a y\u00f6nlendir\n\tflag.CommandLine.Usage = func() { \/\/ Hata durumunda da kullan\u0131m mesaj\u0131n\u0131 g\u00f6steririz\n\t\tfmt.Printf(\"Kullan\u0131m: %s [se\u00e7enekler]\\n\", os.Args[0])\n\t\tflag.PrintDefaults()\n\t}\n\tflag.CommandLine.Init(os.Args[0], flag.ContinueOnError)\n\n\tname := flag.String(\"name\", \"Anonim\", \"Selam verilecek isim\")\n\n\terr := flag.CommandLine.Parse(os.Args[1:]) \/\/ os.Args[1:] ile arg\u00fcmanlar\u0131 ayr\u0131\u015ft\u0131r\n\tif err != nil {\n\t\tfmt.Printf(\"Hata olu\u015ftu: %v\\n\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"Merhaba, %s!\\n\", *name)\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>flag.ContinueOnError<\/code> kullan\u0131ld\u0131\u011f\u0131nda, <code>flag.CommandLine.Parse()<\/code> bir hata d\u00f6nd\u00fcrebilir ve program\u0131n hemen \u00e7\u0131kmas\u0131 engellenir. Bu, \u00f6zellikle karma\u015f\u0131k CLI uygulamalar\u0131nda hata i\u015fleme \u00fczerinde daha fazla kontrol sa\u011flamak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>Kalan Arg\u00fcmanlara Eri\u015fim (<code>flag.Args()<\/code>)<\/h3>\n<p><code>flag.Parse()<\/code> \u00e7a\u011fr\u0131ld\u0131ktan sonra, bayrak olarak tan\u0131mlanmayan ve ayr\u0131\u015ft\u0131r\u0131lmayan t\u00fcm komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 <code>flag.Args()<\/code> fonksiyonu arac\u0131l\u0131\u011f\u0131yla bir string dilimi olarak d\u00f6nd\u00fcr\u00fcl\u00fcr. <code>flag.NArg()<\/code> ise kalan arg\u00fcmanlar\u0131n say\u0131s\u0131n\u0131 verir.<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tcount := flag.Int(\"count\", 1, \"Tekrar say\u0131s\u0131\")\n\t\n\tflag.Parse()\n\n\tfmt.Printf(\"Tekrar say\u0131s\u0131: %d\\n\", *count)\n\n\tif flag.NArg() > 0 {\n\t\tfmt.Printf(\"\u0130\u015flenecek \u00f6\u011feler: %v\\n\", flag.Args())\n\t} else {\n\t\tfmt.Println(\"\u0130\u015flenecek \u00f6\u011fe belirtilmedi.\")\n\t}\n}\n<\/code><\/pre>\n<p>Kullan\u0131m: <code>go run main.go --count 5 item1 item2 item3<\/code><\/p>\n<p>\u00c7\u0131kt\u0131: <code>Tekrar say\u0131s\u0131: 5<\/code>, <code>\u0130\u015flenecek \u00f6\u011feler: [item1 item2 item3]<\/code><\/p>\n<h3><code>flag.FlagSet<\/code> ile Bayrak Gruplar\u0131 Olu\u015fturma<\/h3>\n<p>Tek bir program i\u00e7inde birden fazla ba\u011f\u0131ms\u0131z bayrak grubuna ihtiyac\u0131n\u0131z oldu\u011funda, \u00f6rne\u011fin alt komutlar (subcommands) i\u00e7in (<code>git commit<\/code>, <code>go build<\/code> gibi), <code>flag.FlagSet<\/code> yap\u0131s\u0131n\u0131 kullanabilirsiniz. Her <code>FlagSet<\/code> kendi bayrak setini y\u00f6netir ve kendi <code>Parse()<\/code> metoduna sahiptir.<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\t\/\/ Ana bayraklar\n\tverbose := flag.Bool(\"verbose\", false, \"Genel detayl\u0131 \u00e7\u0131kt\u0131\")\n\n\t\/\/ \"add\" alt komutu i\u00e7in FlagSet\n\taddCmd := flag.NewFlagSet(\"add\", flag.ExitOnError)\n\taddFile := addCmd.String(\"file\", \"\", \"Eklenecek dosya ad\u0131\")\n\taddForce := addCmd.Bool(\"force\", false, \"Ekleme i\u015flemini zorla\")\n\n\t\/\/ \"remove\" alt komutu i\u00e7in FlagSet\n\tremoveCmd := flag.NewFlagSet(\"remove\", flag.ExitOnError)\n\tremoveID := removeCmd.Int(\"id\", 0, \"Kald\u0131r\u0131lacak \u00f6\u011fenin ID'si\")\n\n\tflag.Parse() \/\/ Ana bayraklar\u0131 ayr\u0131\u015ft\u0131r\n\n\tif *verbose {\n\t\tfmt.Println(\"Genel detayl\u0131 mod etkin.\")\n\t}\n\n\t\/\/ Kalan arg\u00fcmanlara bakarak alt komutu belirle\n\tif flag.NArg() == 0 {\n\t\tfmt.Println(\"L\u00fctfen bir komut belirtin: add veya remove\")\n\t\tflag.Usage()\n\t\treturn\n\t}\n\n\tswitch flag.Args()[0] {\n\tcase \"add\":\n\t\taddCmd.Parse(flag.Args()[1:]) \/\/ \"add\" komutunun arg\u00fcmanlar\u0131n\u0131 ayr\u0131\u015ft\u0131r\n\t\tif *addFile == \"\" {\n\t\t\tfmt.Println(\"Hata: add komutu i\u00e7in --file belirtilmeli.\")\n\t\t\taddCmd.Usage()\n\t\t\tos.Exit(1)\n\t\t}\n\t\tfmt.Printf(\"Dosya ekleniyor: %s (Zorla: %t)\\n\", <em>addFile, <\/em>addForce)\n\tcase \"remove\":\n\t\tremoveCmd.Parse(flag.Args()[1:]) \/\/ \"remove\" komutunun arg\u00fcmanlar\u0131n\u0131 ayr\u0131\u015ft\u0131r\n\t\tif *removeID == 0 {\n\t\t\tfmt.Println(\"Hata: remove komutu i\u00e7in --id belirtilmeli.\")\n\t\t\tremoveCmd.Usage()\n\t\t\tos.Exit(1)\n\t\t}\n\t\tfmt.Printf(\"\u00d6\u011fe kald\u0131r\u0131l\u0131yor: ID %d\\n\", *removeID)\n\tdefault:\n\t\tfmt.Printf(\"Bilinmeyen komut: %s\\n\", flag.Args()[0])\n\t\tflag.Usage()\n\t\tos.Exit(1)\n\t}\n}\n<\/code><\/pre>\n<p>Kullan\u0131m:<\/p>\n<ul>\n<li><code>go run main.go add --file mydata.txt --force<\/code><\/li>\n<li><code>go run main.go remove --id 123<\/code><\/li>\n<li><code>go run main.go --verbose add --file newfile.txt<\/code><\/li>\n<\/ul>\n<p><code>FlagSet<\/code> kullan\u0131m\u0131, karma\u015f\u0131k CLI uygulamalar\u0131n\u0131 daha mod\u00fcler ve y\u00f6netilebilir hale getirir.<\/p>\n<h3>\u00c7evre De\u011fi\u015fkenleri ile Entegrasyon<\/h3>\n<p><code>flag<\/code> paketi do\u011frudan \u00e7evre de\u011fi\u015fkenlerinden de\u011fer okuma \u00f6zelli\u011fi sunmaz. Ancak, bu i\u015flevselli\u011fi <code>os.Getenv<\/code> kullanarak kolayca entegre edebilirsiniz:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n)\n\nfunc main() {\n\t\/\/ Varsay\u0131lan de\u011feri \u00e7evre de\u011fi\u015fkeninden al\n\tdefaultPort := 8080\n\tif envPort := os.Getenv(\"APP_PORT\"); envPort != \"\" {\n\t\tif p, err := strconv.Atoi(envPort); err == nil {\n\t\t\tdefaultPort = p\n\t\t}\n\t}\n\tport := flag.Int(\"port\", defaultPort, \"Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 port numaras\u0131 (APP_PORT \u00e7evre de\u011fi\u015fkeni ile de ayarlanabilir)\")\n\n\t\/\/ Varsay\u0131lan de\u011feri do\u011frudan \u00e7evre de\u011fi\u015fkeninden alan string bayrak\n\tdefaultAPIKey := os.Getenv(\"API_KEY\")\n\tapiKey := flag.String(\"api-key\", defaultAPIKey, \"API anahtar\u0131 (API_KEY \u00e7evre de\u011fi\u015fkeni ile de ayarlanabilir)\")\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Uygulama %d portunda \u00e7al\u0131\u015f\u0131yor.\\n\", *port)\n\tif *apiKey != \"\" {\n\t\tfmt.Printf(\"API Anahtar\u0131: %s\\n\", *apiKey)\n\t} else {\n\t\tfmt.Println(\"API Anahtar\u0131 belirtilmedi.\")\n\t}\n}\n<\/code><\/pre>\n<p>Kullan\u0131m:<\/p>\n<ul>\n<li><code>go run main.go<\/code>: <code>Uygulama 8080 portunda \u00e7al\u0131\u015f\u0131yor. API Anahtar\u0131 belirtilmedi.<\/code><\/li>\n<li><code>APP_PORT=9000 API_KEY=mysecretkey go run main.go<\/code>: <code>Uygulama 9000 portunda \u00e7al\u0131\u015f\u0131yor. API Anahtar\u0131: mysecretkey<\/code><\/li>\n<li><code>APP_PORT=9000 go run main.go --port 9090<\/code>: Komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 her zaman \u00e7evre de\u011fi\u015fkenlerini ezer. Bu durumda port 9090 olur.<\/li>\n<\/ul>\n<h3>Varsay\u0131lan De\u011ferleri De\u011fi\u015ftirme<\/h3>\n<p>Bayraklar\u0131 tan\u0131mlarken bir varsay\u0131lan de\u011fer atars\u0131n\u0131z. Ancak bazen programatik olarak bir bayra\u011f\u0131n varsay\u0131lan de\u011ferini de\u011fi\u015ftirmek isteyebilirsiniz. Bunu <code>flag.Lookup()<\/code> ve <code>flag.Value.Set()<\/code> metodlar\u0131n\u0131 kullanarak yapabilirsiniz:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tname := flag.String(\"name\", \"Varsay\u0131lan\", \"Selam verilecek isim\")\n\n\t\/\/ Programatik olarak varsay\u0131lan de\u011feri de\u011fi\u015ftirme\n\tif f := flag.Lookup(\"name\"); f != nil {\n\t\tf.Value.Set(\"YeniVarsay\u0131lan\") \/\/ Set metodu string bekler\n\t}\n\n\tflag.Parse()\n\n\tfmt.Printf(\"Merhaba, %s!\\n\", *name)\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, e\u011fer komut sat\u0131r\u0131nda <code>--name<\/code> belirtilmezse, yeni varsay\u0131lan de\u011fer olan &#8220;YeniVarsay\u0131lan&#8221; kullan\u0131lacakt\u0131r.<\/p>\n<h2>Uygulama \u00d6rne\u011fi: Basit Bir Komut Sat\u0131r\u0131 Arac\u0131<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi bir araya getirerek, basit bir metin dosyas\u0131 i\u015fleme arac\u0131 olu\u015ftural\u0131m. Bu ara\u00e7, bir giri\u015f dosyas\u0131n\u0131 okuyacak, iste\u011fe ba\u011fl\u0131 olarak b\u00fcy\u00fck harfe \u00e7evirecek ve \u00e7\u0131kt\u0131 dosyas\u0131n\u0131 belirleyecek.<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"bufio\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc main() {\n\t\/\/ Bayraklar\u0131 tan\u0131mlama\n\tinputFilePath := flag.String(\"input\", \"\", \"Giri\u015f metin dosyas\u0131n\u0131n yolu (zorunlu)\")\n\toutputFilePath := flag.String(\"output\", \"\", \"\u00c7\u0131kt\u0131 metin dosyas\u0131n\u0131n yolu (varsay\u0131lan: stdout)\")\n\tuppercase := flag.Bool(\"uppercase\", false, \"\u00c7\u0131kt\u0131y\u0131 b\u00fcy\u00fck harfe \u00e7evir\")\n\tlinePrefix := flag.String(\"prefix\", \"\", \"Her sat\u0131r\u0131n ba\u015f\u0131na eklenecek \u00f6n ek\")\n\n\t\/\/ Kullan\u0131m mesaj\u0131n\u0131 \u00f6zelle\u015ftirme\n\tflag.Usage = func() {\n\t\tfmt.Fprintf(os.Stderr, \"Kullan\u0131m: %s [se\u00e7enekler]\\n\", os.Args[0])\n\t\tfmt.Fprintln(os.Stderr, \"Basit bir metin dosyas\u0131 i\u015fleme arac\u0131.\")\n\t\tfmt.Fprintln(os.Stderr, \"Se\u00e7enekler:\")\n\t\tflag.PrintDefaults()\n\t\tfmt.Fprintln(os.Stderr, \"\\n\u00d6rnek: mytexttool --input data.txt --output processed.txt --uppercase\")\n\t}\n\n\tflag.Parse()\n\n\t\/\/ Giri\u015f dosyas\u0131 zorunlu\n\tif *inputFilePath == \"\" {\n\t\tfmt.Fprintln(os.Stderr, \"Hata: --input bayra\u011f\u0131 zorunludur.\")\n\t\tflag.Usage()\n\t\tos.Exit(1)\n\t}\n\n\t\/\/ Giri\u015f dosyas\u0131n\u0131 a\u00e7\n\tinputFile, err := os.Open(*inputFilePath)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"Giri\u015f dosyas\u0131 a\u00e7\u0131lamad\u0131: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\tdefer inputFile.Close()\n\n\t\/\/ \u00c7\u0131kt\u0131 hedefini belirle (dosya veya stdout)\n\tvar outputWriter io.Writer\n\tif *outputFilePath != \"\" {\n\t\toutputFile, err := os.Create(*outputFilePath)\n\t\tif err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"\u00c7\u0131kt\u0131 dosyas\u0131 olu\u015fturulamad\u0131: %v\\n\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\t\tdefer outputFile.Close()\n\t\toutputWriter = outputFile\n\t} else {\n\t\toutputWriter = os.Stdout\n\t}\n\n\tscanner := bufio.NewScanner(inputFile)\n\twriter := bufio.NewWriter(outputWriter)\n\tdefer writer.Flush() \/\/ \u00c7\u0131k\u0131\u015ftan \u00f6nce t\u00fcm tamponu bo\u015falt\n\n\tlineNum := 0\n\tfor scanner.Scan() {\n\t\tlineNum++\n\t\tline := scanner.Text()\n\n\t\t\/\/ \u00d6n ek ekle\n\t\tif *linePrefix != \"\" {\n\t\t\tline = *linePrefix + line\n\t\t}\n\n\t\t\/\/ B\u00fcy\u00fck harfe \u00e7evir\n\t\tif *uppercase {\n\t\t\tline = strings.ToUpper(line)\n\t\t}\n\n\t\t\/\/ \u00c7\u0131kt\u0131ya yaz\n\t\t_, err := writer.WriteString(line + \"\\n\")\n\t\tif err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"\u00c7\u0131kt\u0131ya yazarken hata olu\u015ftu: %v\\n\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\t}\n\n\tif err := scanner.Err(); err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"Giri\u015f dosyas\u0131n\u0131 okurken hata olu\u015ftu: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\n\tfmt.Printf(\"\u0130\u015flem tamamland\u0131. %d sat\u0131r i\u015flendi.\\n\", lineNum)\n}\n<\/code><\/pre>\n<p>Bu arac\u0131 kullanmak i\u00e7in \u00f6nce bir <code>data.txt<\/code> dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>Merhaba Go\nBu bir deneme metnidir.\nFlag paketi \u00e7ok kullan\u0131\u015fl\u0131.\n<\/code><\/pre>\n<p>\u015eimdi arac\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m:<\/p>\n<ul>\n<li><code>go run main.go<\/code>: Hata verecektir \u00e7\u00fcnk\u00fc <code>--input<\/code> zorunlu.<\/li>\n<li><code>go run main.go --input data.txt<\/code>: \u00c7\u0131kt\u0131y\u0131 standart \u00e7\u0131kt\u0131ya yazar.<\/li>\n<li><code>go run main.go --input data.txt --uppercase<\/code>: \u00c7\u0131kt\u0131y\u0131 b\u00fcy\u00fck harfe \u00e7evirir ve standart \u00e7\u0131kt\u0131ya yazar.<\/li>\n<li><code>go run main.go --input data.txt --output processed.txt --prefix \"LINE: \"<\/code> : \u00c7\u0131kt\u0131y\u0131 <code>processed.txt<\/code> dosyas\u0131na yazar ve her sat\u0131r\u0131n ba\u015f\u0131na &#8220;LINE: &#8221; ekler.<\/li>\n<\/ul>\n<p>Bu \u00f6rnek, <code>flag<\/code> paketinin \u00e7e\u015fitli \u00f6zelliklerini (string, bool bayraklar, zorunlu bayrak kontrol\u00fc, \u00f6zel kullan\u0131m mesaj\u0131) ger\u00e7ek bir senaryoda nas\u0131l birle\u015ftirebilece\u011finizi g\u00f6sterir.<\/p>\n<h2>S\u0131n\u0131rlamalar ve Alternatifler<\/h2>\n<p><code>flag<\/code> paketi, Go&#8217;da komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 y\u00f6netmek i\u00e7in basit ve etkili bir \u00e7\u00f6z\u00fcm sunar. Ancak, \u00f6zellikle \u00e7ok karma\u015f\u0131k CLI uygulamalar\u0131 i\u00e7in baz\u0131 s\u0131n\u0131rlamalar\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>Alt Komutlar i\u00e7in manuel y\u00f6netim<\/strong>: <code>flag.FlagSet<\/code> ile alt komutlar\u0131 y\u00f6netmek m\u00fcmk\u00fcn olsa da, bu s\u00fcrecin \u00e7o\u011funu manuel olarak yapman\u0131z gerekir (arg\u00fcmanlar\u0131 dilimlemek, do\u011fru <code>FlagSet<\/code>&#8216;i se\u00e7mek vb.).<\/li>\n<li><strong>Bayrak Gruplar\u0131<\/strong>: <code>flag<\/code> paketi, mant\u0131ksal olarak birbiriyle ili\u015fkili bayraklar\u0131 gruplamak i\u00e7in yerle\u015fik bir mekanizma sunmaz.<\/li>\n<li><strong>Geli\u015fmi\u015f Do\u011frulama<\/strong>: Bayrak de\u011ferleri i\u00e7in karma\u015f\u0131k do\u011frulama kurallar\u0131 (\u00f6rne\u011fin, bir say\u0131n\u0131n belirli bir aral\u0131kta olmas\u0131) genellikle manuel olarak uygulanmal\u0131d\u0131r.<\/li>\n<li><strong>Otomatik Tamamlama (Autocompletion)<\/strong>: Geli\u015fmi\u015f CLI k\u00fct\u00fcphaneleri genellikle kabuk otomatik tamamlama \u00f6zellikleri sunarken, <code>flag<\/code> paketi bu t\u00fcr bir destek sa\u011flamaz.<\/li>\n<\/ul>\n<p>Bu s\u0131n\u0131rlamalarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda veya daha zengin \u00f6zelliklere sahip bir CLI deneyimi olu\u015fturmak istedi\u011finizde, Go toplulu\u011funda pop\u00fcler olan alternatif k\u00fct\u00fcphanelere y\u00f6nelebilirsiniz:<\/p>\n<ul>\n<li>\n<p><strong>Cobra<\/strong>: En pop\u00fcler CLI k\u00fct\u00fcphanelerinden biridir. G\u00fc\u00e7l\u00fc alt komut deste\u011fi, i\u00e7 i\u00e7e komutlar, bayrak gruplar\u0131, otomatik tamamlama ve kolay yap\u0131land\u0131rma gibi bir\u00e7ok geli\u015fmi\u015f \u00f6zellik sunar. <code>kubectl<\/code>, <code>Docker<\/code>, <code>Hugo<\/code> gibi bir\u00e7ok b\u00fcy\u00fck proje Cobra kullan\u0131r.<\/p>\n<pre><code class=\"language-go\">import \"github.com\/spf13\/cobra\"<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>urfave\/cli (eski ad\u0131yla <code>cli<\/code>)<\/strong>: Basit ve h\u0131zl\u0131 CLI uygulamalar\u0131 olu\u015fturmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>flag<\/code> paketine g\u00f6re daha fazla \u00f6zellik sunar ve alt komutlar\u0131 daha kolay y\u00f6netir. \u00d6zellikle daha az karma\u015f\u0131k ancak <code>flag<\/code>&#8216;den daha fazlas\u0131n\u0131 isteyen projeler i\u00e7in iyi bir se\u00e7enektir.<\/p>\n<pre><code class=\"language-go\">import \"github.com\/urfave\/cli\/v2\"<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>pflag<\/strong>: <code>flag<\/code> paketi ile API uyumlulu\u011funu korurken, GNU <code>getopt<\/code> stili bayraklar\u0131 (\u00f6rne\u011fin, uzun form <code>--name<\/code> ve k\u0131sa form <code>-n<\/code>, tek tireli uzun formlar) destekleyen bir k\u00fct\u00fcphanedir. E\u011fer <code>flag<\/code> paketinin basitli\u011fini seviyor ancak daha fazla bayrak stili esnekli\u011fi istiyorsan\u0131z iyi bir alternatiftir.<\/p>\n<pre><code class=\"language-go\">import \"github.com\/spf13\/pflag\"<\/code><\/pre>\n<\/li>\n<\/ul>\n<p>Genel olarak, uygulaman\u0131z\u0131n komut sat\u0131r\u0131 aray\u00fcz\u00fc basitse ve yaln\u0131zca birka\u00e7 bayra\u011fa ihtiyac\u0131n\u0131z varsa, <code>flag<\/code> paketi m\u00fckemmel bir se\u00e7imdir. Ancak, uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve alt komutlar, karma\u015f\u0131k bayrak etkile\u015fimleri veya zengin bir kullan\u0131c\u0131 deneyimi gerektiren daha geli\u015fmi\u015f bir CLI&#8217;ye ihtiya\u00e7 duyduk\u00e7a, Cobra veya urfave\/cli gibi alternatifleri de\u011ferlendirmek ak\u0131ll\u0131ca olacakt\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Go&#8217;nun <code>flag<\/code> paketi, komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 Go programlar\u0131nda y\u00f6netmek i\u00e7in basit, etkili ve standart bir y\u00f6ntem sunar. Temel veri t\u00fcrleri i\u00e7in bayrak tan\u0131mlamadan, \u00f6zel bayrak t\u00fcrleri olu\u015fturmaya, hata y\u00f6netimine ve <code>FlagSet<\/code> ile alt komutlar\u0131 desteklemeye kadar geni\u015f bir yelpazede i\u015flevsellik sa\u011flar. Bu makalede ele ald\u0131\u011f\u0131m\u0131z konular, Go projelerinizde komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 g\u00fc\u00e7l\u00fc bir \u015fekilde kullanman\u0131z i\u00e7in size sa\u011flam bir temel sunmaktad\u0131r.<\/p>\n<p>Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, <code>flag<\/code> paketi uygulamalar\u0131n\u0131z\u0131n daha esnek, yap\u0131land\u0131r\u0131labilir ve kullan\u0131c\u0131 dostu olmas\u0131n\u0131 sa\u011flar. Komut sat\u0131r\u0131 aray\u00fcz\u00fcn\u00fcz\u00fcn karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131\u011f\u0131nda alternatif k\u00fct\u00fcphaneleri de\u011ferlendirmek faydal\u0131 olsa da, \u00e7o\u011fu durumda <code>flag<\/code> paketi ihtiyac\u0131n\u0131z olan her \u015feyi fazlas\u0131yla kar\u015f\u0131layacakt\u0131r. Go geli\u015ftiricileri olarak, bu temel paketi ustaca kullanmak, sa\u011flam ve profesyonel uygulamalar olu\u015fturma becerinizin \u00f6nemli bir par\u00e7as\u0131d\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Go&#8217;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek\nGiri\u015f\nGo programlama dili, uygulamalar\u0131n komut sat\u0131r\u0131 arg\u00fcman","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-33293","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&#039;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek - 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\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go&#039;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek\" \/>\n<meta property=\"og:description\" content=\"Go&#039;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek Giri\u015f Go programlama dili, uygulamalar\u0131n komut sat\u0131r\u0131 arg\u00fcman\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-01T02:41:02+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go&#8217;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek\",\"datePublished\":\"2025-11-01T02:41:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\"},\"wordCount\":2161,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\",\"name\":\"Go'da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-01T02:41:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go&#8217;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek\"}]},{\"@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'da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek - 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\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Go'da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek","og_description":"Go'da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek Giri\u015f Go programlama dili, uygulamalar\u0131n komut sat\u0131r\u0131 arg\u00fcman","og_url":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-01T02:41:02+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go&#8217;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek","datePublished":"2025-11-01T02:41:02+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/"},"wordCount":2161,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/","url":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/","name":"Go'da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-01T02:41:02+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/goda-flag-paketi-nasil-kullanilir-komut-satiri-argumanlarini-yonetmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go&#8217;da flag Paketi Nas\u0131l Kullan\u0131l\u0131r: Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131n\u0131 Y\u00f6netmek"}]},{"@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\/33293","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=33293"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33293\/revisions"}],"predecessor-version":[{"id":33294,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33293\/revisions\/33294"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}