[{"data":1,"prerenderedAt":937},["ShallowReactive",2],{"post-\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir":3},{"page":4,"translation":768,"nav":783,"related":914,"random":926},{"id":5,"title":6,"body":7,"categories":766,"category":768,"date":769,"description":770,"draft":771,"extension":772,"image":773,"kind":768,"lang":106,"meta":774,"navigation":275,"path":775,"readingTime":236,"seo":776,"slug":777,"stem":778,"tags":779,"translationKey":768,"type":767,"updated":781,"__hash__":782},"postsTr\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir.md","Go ile WebSockets: Upgrader Nedir?",{"type":8,"value":9,"toc":760},"minimark",[10,64,67,91,94,99,175,177,182,191,194,205,240,242,246,251,451,453,457,463,726,737,739,744,756],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Özet (TL;DR):",[22,23,24,36,50],"ul",{},[25,26,27,30,31,35],"li",{},[18,28,29],{},"Nedir:"," ",[32,33,34],"code",{},"websocket.Upgrader",", standart bir HTTP bağlantısını (TCP el sıkışması ile) çift yönlü, düşük gecikmeli bir WebSocket bağlantısına dönüştüren (Upgrade) Gorilla WebSocket metodudur.",[25,37,38,41,42,45,46,49],{},[18,39,40],{},"Kritik Hata Düzeltmesi:"," Orijinal yazıdaki ",[32,43,44],{},"Upgrader"," struct yorum satırlarında yer alan, yorum işareti (",[32,47,48],{},"\u002F\u002F",") unutulduğu için derleme hatasına yol açan satır düzeltilmiştir.",[25,51,52,55,56,59,60,63],{},[18,53,54],{},"Temel Yapılandırma:"," Geliştirme ortamında ",[32,57,58],{},"CheckOrigin"," fonksiyonunun ",[32,61,62],{},"true"," dönmesi sağlanarak tarayıcı kökenli CORS engellemelerinin önüne geçilmesi yaygın bir pratiktir.",[14,65,66],{},"Bir süredir Go ile haşır neşir oluyorum ve son 1-2 gündür de WebSocket üzerinde çalışıyorum. Go ile WebSocket destekli bir uygulama yazmak için ek paketler kullanmanız şart olmasa da, hem Amerika'yi yeniden keşfetmemek hem de Go dünyasında yeniyseniz kendinize fazla yüklenmemek için kullanabileceğiniz çeşitli kütüphaneler mevcut.",[14,68,69,70,82,83,90],{},"Bu kütüphaneler arasında Go topluluğu tarafından en yaygın kabul gören ve popüler olanı ",[18,71,72],{},[73,74,81],"a",{"href":75,"rel":76,"target":80},"https:\u002F\u002Fgithub.com\u002Fgorilla\u002Fwebsocket",[77,78,79],"nofollow","noopener","noreferrer","_blank","gorilla\u002Fwebsocket"," kütüphanesidir. Ben kendi adıma örnekleri ve dokümantasyonu geniş olduğu için önce bu kütüphaneyle bir şeyler yapmayı, ardından ",[18,84,85],{},[73,86,89],{"href":87,"rel":88,"target":80},"https:\u002F\u002Fgithub.com\u002Fnhooyr\u002Fwebsocket",[77,78,79],"nhooyr\u002Fwebsocket"," kütüphanesine geçiş yapmayı düşünüyorum.",[92,93],"hr",{},[95,96,98],"h3",{"id":97},"http-vs-websocket-karşılaştırması","HTTP vs. WebSocket Karşılaştırması",[100,101,102,119],"table",{},[103,104,105],"thead",{},[106,107,108,113,116],"tr",{},[109,110,112],"th",{"align":111},"left","Özellik",[109,114,115],{"align":111},"HTTP (Standart)",[109,117,118],{"align":111},"WebSocket",[120,121,122,136,149,162],"tbody",{},[106,123,124,130,133],{},[125,126,127],"td",{"align":111},[18,128,129],{},"İletişim Türü",[125,131,132],{"align":111},"Tek yönlü (İstemci ister, sunucu cevap verir).",[125,134,135],{"align":111},"Çift yönlü (Bi-directional) - İki taraf da aynı anda veri gönderebilir.",[106,137,138,143,146],{},[125,139,140],{"align":111},[18,141,142],{},"Bağlantı Tipi",[125,144,145],{"align":111},"Stateless (Her istekte bağlantı açılır\u002Fkapanır).",[125,147,148],{"align":111},"Persistent (Bağlantı sürekli açık kalır).",[106,150,151,156,159],{},[125,152,153],{"align":111},[18,154,155],{},"Gecikme (Latency)",[125,157,158],{"align":111},"Yüksek (Her istekte HTTP başlıkları taşınır).",[125,160,161],{"align":111},"Çok Düşük (Handshake sonrası başlık yükü yoktur).",[106,163,164,169,172],{},[125,165,166],{"align":111},[18,167,168],{},"Kullanım Senaryosu",[125,170,171],{"align":111},"Klasik web sayfaları, REST API'ler.",[125,173,174],{"align":111},"Canlı sohbet, anlık borsa grafikleri, çok oyunculu oyunlar.",[92,176],{},[178,179,181],"h2",{"id":180},"_1-websocketupgrader-nedir","1. websocket.Upgrader Nedir?",[14,183,184,185,187,188,190],{},"Gorilla WebSocket kütüphanesinde daha başlarken ",[32,186,34],{}," kullanıldığını görürüz. ",[18,189,44],{},", standart bir HTTP bağlantısını güvenli bir el sıkışması (handshake) ile WebSocket bağlantısına \"yükselten\" (upgrade) Gorilla kütüphanesi metodudur.",[14,192,193],{},"Temel mantık şu şekilde çalışır: İstemci, belirlenen HTTP adresine istek yaparak bağlantının WebSocket'e yükseltilmesini ister; sunucu da istek gereken şartları (belirlenen güvenlik kurallarını) karşılıyorsa bağlantıyı onaylayıp TCP hattını sürekli açık tutacak şekilde WebSocket moduna geçirir.",[14,195,196,197,200,201,204],{},"Upgrader tanımlanırken genelde sadece ",[32,198,199],{},"ReadBufferSize"," ve ",[32,202,203],{},"WriteBufferSize"," tampon (buffer) değerleri belirtilir:",[206,207,212],"pre",{"className":208,"code":209,"language":210,"meta":211,"style":211},"language-go shiki shiki-themes github-light github-dark","var upgrader = websocket.Upgrader{\n    ReadBufferSize:  4096,\n    WriteBufferSize: 4096,\n}\n","go","",[32,213,214,222,228,234],{"__ignoreMap":211},[215,216,219],"span",{"class":217,"line":218},"line",1,[215,220,221],{},"var upgrader = websocket.Upgrader{\n",[215,223,225],{"class":217,"line":224},2,[215,226,227],{},"    ReadBufferSize:  4096,\n",[215,229,231],{"class":217,"line":230},3,[215,232,233],{},"    WriteBufferSize: 4096,\n",[215,235,237],{"class":217,"line":236},4,[215,238,239],{},"}\n",[92,241],{},[178,243,245],{"id":244},"_2-upgrader-yapısının-detaylı-parametreleri","2. Upgrader Yapısının Detaylı Parametreleri",[14,247,248,250],{},[32,249,44],{}," yapısının (struct) alabileceği tüm parametreler ve açıklamaları aşağıda belirtilmiştir:",[206,252,254],{"className":208,"code":253,"language":210,"meta":211,"style":211},"type Upgrader struct {\n    \u002F\u002F HandshakeTimeout el sıkışması (handshake) süresi için bir azami limit belirler.\n    HandshakeTimeout time.Duration\n\n    \u002F\u002F ReadBufferSize ve WriteBufferSize I\u002FO tampon büyüklüklerini bayt olarak\n    \u002F\u002F belirlemek içindir. Tampon (buffer) boyutu sıfırsa HTTP sunucusu tarafından\n    \u002F\u002F belirlenen tampon kullanılır. I\u002FO tampon boyutları gönderilecek veya alınacak\n    \u002F\u002F mesajların boyutunu sınırlandırmaz.\n    ReadBufferSize, WriteBufferSize int\n\n    \u002F\u002F WriteBufferPool yazma işlemleri için bir tampon havuzudur. Değer belirtilmezse\n    \u002F\u002F yazma tamponları bağlantı yaşam süresi boyunca tahsis edilir.\n    WriteBufferPool BufferPool\n\n    \u002F\u002F Subprotocols sunucunun desteklediği alt protokolleri tercih sırasına göre belirtir.\n    \u002F\u002F Bu alan nil değilse Upgrade metodu bu listenin başından başlayarak istemcinin\n    \u002F\u002F istediği protokole göre bir tercih yapar.\n    Subprotocols []string\n\n    \u002F\u002F Error HTTP hata yanıtlarını oluşturacak fonksiyonu belirler. Error nil ise\n    \u002F\u002F HTTP yanıtını oluşturmak için http.Error kullanılır.\n    Error func(w http.ResponseWriter, r *http.Request, status int, reason error)\n\n    \u002F\u002F CheckOrigin isteğin köken (Origin) başlığının kabul edilme kriterlerini denetler.\n    \u002F\u002F Eğer CheckOrigin nil ise varsayılan olarak origin header'ı varsa ve origin\n    \u002F\u002F host değeri request host başlık değerinden farklıysa false döndürür.\n    \u002F\u002F Cross-site istek saldırılarından (CSRF) korunmak için bu fonksiyon kullanılmalıdır.\n    CheckOrigin func(r *http.Request) bool\n\n    \u002F\u002F EnableCompression sunucunun mesaj sıkıştırmayı (RFC 7692) etkinleştirmeyi\n    \u002F\u002F denemesini sağlar. True olarak ayarlamak sıkıştırmayı garanti etmez.\n    \u002F\u002F Mevcut desteklenen modlar \"no context\" ve \"takeover\" modlarıdır.\n    EnableCompression bool\n}\n",[32,255,256,261,266,271,277,283,289,295,301,307,312,318,324,330,335,341,347,353,359,364,370,376,382,387,393,399,405,411,417,422,428,434,440,446],{"__ignoreMap":211},[215,257,258],{"class":217,"line":218},[215,259,260],{},"type Upgrader struct {\n",[215,262,263],{"class":217,"line":224},[215,264,265],{},"    \u002F\u002F HandshakeTimeout el sıkışması (handshake) süresi için bir azami limit belirler.\n",[215,267,268],{"class":217,"line":230},[215,269,270],{},"    HandshakeTimeout time.Duration\n",[215,272,273],{"class":217,"line":236},[215,274,276],{"emptyLinePlaceholder":275},true,"\n",[215,278,280],{"class":217,"line":279},5,[215,281,282],{},"    \u002F\u002F ReadBufferSize ve WriteBufferSize I\u002FO tampon büyüklüklerini bayt olarak\n",[215,284,286],{"class":217,"line":285},6,[215,287,288],{},"    \u002F\u002F belirlemek içindir. Tampon (buffer) boyutu sıfırsa HTTP sunucusu tarafından\n",[215,290,292],{"class":217,"line":291},7,[215,293,294],{},"    \u002F\u002F belirlenen tampon kullanılır. I\u002FO tampon boyutları gönderilecek veya alınacak\n",[215,296,298],{"class":217,"line":297},8,[215,299,300],{},"    \u002F\u002F mesajların boyutunu sınırlandırmaz.\n",[215,302,304],{"class":217,"line":303},9,[215,305,306],{},"    ReadBufferSize, WriteBufferSize int\n",[215,308,310],{"class":217,"line":309},10,[215,311,276],{"emptyLinePlaceholder":275},[215,313,315],{"class":217,"line":314},11,[215,316,317],{},"    \u002F\u002F WriteBufferPool yazma işlemleri için bir tampon havuzudur. Değer belirtilmezse\n",[215,319,321],{"class":217,"line":320},12,[215,322,323],{},"    \u002F\u002F yazma tamponları bağlantı yaşam süresi boyunca tahsis edilir.\n",[215,325,327],{"class":217,"line":326},13,[215,328,329],{},"    WriteBufferPool BufferPool\n",[215,331,333],{"class":217,"line":332},14,[215,334,276],{"emptyLinePlaceholder":275},[215,336,338],{"class":217,"line":337},15,[215,339,340],{},"    \u002F\u002F Subprotocols sunucunun desteklediği alt protokolleri tercih sırasına göre belirtir.\n",[215,342,344],{"class":217,"line":343},16,[215,345,346],{},"    \u002F\u002F Bu alan nil değilse Upgrade metodu bu listenin başından başlayarak istemcinin\n",[215,348,350],{"class":217,"line":349},17,[215,351,352],{},"    \u002F\u002F istediği protokole göre bir tercih yapar.\n",[215,354,356],{"class":217,"line":355},18,[215,357,358],{},"    Subprotocols []string\n",[215,360,362],{"class":217,"line":361},19,[215,363,276],{"emptyLinePlaceholder":275},[215,365,367],{"class":217,"line":366},20,[215,368,369],{},"    \u002F\u002F Error HTTP hata yanıtlarını oluşturacak fonksiyonu belirler. Error nil ise\n",[215,371,373],{"class":217,"line":372},21,[215,374,375],{},"    \u002F\u002F HTTP yanıtını oluşturmak için http.Error kullanılır.\n",[215,377,379],{"class":217,"line":378},22,[215,380,381],{},"    Error func(w http.ResponseWriter, r *http.Request, status int, reason error)\n",[215,383,385],{"class":217,"line":384},23,[215,386,276],{"emptyLinePlaceholder":275},[215,388,390],{"class":217,"line":389},24,[215,391,392],{},"    \u002F\u002F CheckOrigin isteğin köken (Origin) başlığının kabul edilme kriterlerini denetler.\n",[215,394,396],{"class":217,"line":395},25,[215,397,398],{},"    \u002F\u002F Eğer CheckOrigin nil ise varsayılan olarak origin header'ı varsa ve origin\n",[215,400,402],{"class":217,"line":401},26,[215,403,404],{},"    \u002F\u002F host değeri request host başlık değerinden farklıysa false döndürür.\n",[215,406,408],{"class":217,"line":407},27,[215,409,410],{},"    \u002F\u002F Cross-site istek saldırılarından (CSRF) korunmak için bu fonksiyon kullanılmalıdır.\n",[215,412,414],{"class":217,"line":413},28,[215,415,416],{},"    CheckOrigin func(r *http.Request) bool\n",[215,418,420],{"class":217,"line":419},29,[215,421,276],{"emptyLinePlaceholder":275},[215,423,425],{"class":217,"line":424},30,[215,426,427],{},"    \u002F\u002F EnableCompression sunucunun mesaj sıkıştırmayı (RFC 7692) etkinleştirmeyi\n",[215,429,431],{"class":217,"line":430},31,[215,432,433],{},"    \u002F\u002F denemesini sağlar. True olarak ayarlamak sıkıştırmayı garanti etmez.\n",[215,435,437],{"class":217,"line":436},32,[215,438,439],{},"    \u002F\u002F Mevcut desteklenen modlar \"no context\" ve \"takeover\" modlarıdır.\n",[215,441,443],{"class":217,"line":442},33,[215,444,445],{},"    EnableCompression bool\n",[215,447,449],{"class":217,"line":448},34,[215,450,239],{},[92,452],{},[178,454,456],{"id":455},"_3-çalışan-websocket-sunucu-örneği-go","3. Çalışan WebSocket Sunucu Örneği (Go)",[14,458,459,460,462],{},"Aşağıdaki örnekte, tarayıcı isteklerine açık (",[32,461,58],{}," devrede) ve gelen mesajları geri döndüren (Echo Server) çalışan bir Go WebSocket uygulamasını inceleyebilirsiniz:",[206,464,466],{"className":208,"code":465,"language":210,"meta":211,"style":211},"package main\n\nimport (\n    \"fmt\"\n    \"net\u002Fhttp\"\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n)\n\nvar myUpgrader = websocket.Upgrader{\n    ReadBufferSize:  1024,\n    WriteBufferSize: 1024,\n    CheckOrigin: func(r *http.Request) bool {\n        \u002F\u002F Tarayıcı kökenli CORS engellemelerini aşmak için geliştirme ortamında true dönüyoruz\n        return true \n    },\n}\n\nfunc handleWebSocket(w http.ResponseWriter, r *http.Request) {\n    \u002F\u002F HTTP bağlantısını WebSocket bağlantısına yükseltiyoruz\n    conn, err := myUpgrader.Upgrade(w, r, nil)\n    if err != nil {\n        fmt.Println(\"WebSocket bağlantısı kurulamadı:\", err)\n        return\n    }\n    defer conn.Close()\n\n    fmt.Println(\"WebSocket istemcisi başarıyla bağlandı!\")\n\n    for {\n        \u002F\u002F İstemciden gelen mesajı oku\n        messageType, p, err := conn.ReadMessage()\n        if err != nil {\n            fmt.Println(\"Mesaj okuma hatası:\", err)\n            return\n        }\n\n        fmt.Printf(\"Gelen Mesaj: %s\\n\", string(p))\n\n        \u002F\u002F Gelen mesajı aynı şekilde istemciye geri gönder (Echo)\n        if err := conn.WriteMessage(messageType, p); err != nil {\n            fmt.Println(\"Mesaj yazma hatası:\", err)\n            return\n        }\n    }\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fws\", handleWebSocket)\n    fmt.Println(\"WebSocket sunucusu :8080 portunda çalışıyor...\")\n    http.ListenAndServe(\":8080\", nil)\n}\n",[32,467,468,473,477,482,487,492,497,502,506,511,516,521,526,531,536,541,545,549,554,559,564,569,574,579,584,589,593,598,602,607,612,617,622,627,632,638,643,649,654,660,666,672,677,682,687,692,697,703,709,715,721],{"__ignoreMap":211},[215,469,470],{"class":217,"line":218},[215,471,472],{},"package main\n",[215,474,475],{"class":217,"line":224},[215,476,276],{"emptyLinePlaceholder":275},[215,478,479],{"class":217,"line":230},[215,480,481],{},"import (\n",[215,483,484],{"class":217,"line":236},[215,485,486],{},"    \"fmt\"\n",[215,488,489],{"class":217,"line":279},[215,490,491],{},"    \"net\u002Fhttp\"\n",[215,493,494],{"class":217,"line":285},[215,495,496],{},"    \"github.com\u002Fgorilla\u002Fwebsocket\"\n",[215,498,499],{"class":217,"line":291},[215,500,501],{},")\n",[215,503,504],{"class":217,"line":297},[215,505,276],{"emptyLinePlaceholder":275},[215,507,508],{"class":217,"line":303},[215,509,510],{},"var myUpgrader = websocket.Upgrader{\n",[215,512,513],{"class":217,"line":309},[215,514,515],{},"    ReadBufferSize:  1024,\n",[215,517,518],{"class":217,"line":314},[215,519,520],{},"    WriteBufferSize: 1024,\n",[215,522,523],{"class":217,"line":320},[215,524,525],{},"    CheckOrigin: func(r *http.Request) bool {\n",[215,527,528],{"class":217,"line":326},[215,529,530],{},"        \u002F\u002F Tarayıcı kökenli CORS engellemelerini aşmak için geliştirme ortamında true dönüyoruz\n",[215,532,533],{"class":217,"line":332},[215,534,535],{},"        return true \n",[215,537,538],{"class":217,"line":337},[215,539,540],{},"    },\n",[215,542,543],{"class":217,"line":343},[215,544,239],{},[215,546,547],{"class":217,"line":349},[215,548,276],{"emptyLinePlaceholder":275},[215,550,551],{"class":217,"line":355},[215,552,553],{},"func handleWebSocket(w http.ResponseWriter, r *http.Request) {\n",[215,555,556],{"class":217,"line":361},[215,557,558],{},"    \u002F\u002F HTTP bağlantısını WebSocket bağlantısına yükseltiyoruz\n",[215,560,561],{"class":217,"line":366},[215,562,563],{},"    conn, err := myUpgrader.Upgrade(w, r, nil)\n",[215,565,566],{"class":217,"line":372},[215,567,568],{},"    if err != nil {\n",[215,570,571],{"class":217,"line":378},[215,572,573],{},"        fmt.Println(\"WebSocket bağlantısı kurulamadı:\", err)\n",[215,575,576],{"class":217,"line":384},[215,577,578],{},"        return\n",[215,580,581],{"class":217,"line":389},[215,582,583],{},"    }\n",[215,585,586],{"class":217,"line":395},[215,587,588],{},"    defer conn.Close()\n",[215,590,591],{"class":217,"line":401},[215,592,276],{"emptyLinePlaceholder":275},[215,594,595],{"class":217,"line":407},[215,596,597],{},"    fmt.Println(\"WebSocket istemcisi başarıyla bağlandı!\")\n",[215,599,600],{"class":217,"line":413},[215,601,276],{"emptyLinePlaceholder":275},[215,603,604],{"class":217,"line":419},[215,605,606],{},"    for {\n",[215,608,609],{"class":217,"line":424},[215,610,611],{},"        \u002F\u002F İstemciden gelen mesajı oku\n",[215,613,614],{"class":217,"line":430},[215,615,616],{},"        messageType, p, err := conn.ReadMessage()\n",[215,618,619],{"class":217,"line":436},[215,620,621],{},"        if err != nil {\n",[215,623,624],{"class":217,"line":442},[215,625,626],{},"            fmt.Println(\"Mesaj okuma hatası:\", err)\n",[215,628,629],{"class":217,"line":448},[215,630,631],{},"            return\n",[215,633,635],{"class":217,"line":634},35,[215,636,637],{},"        }\n",[215,639,641],{"class":217,"line":640},36,[215,642,276],{"emptyLinePlaceholder":275},[215,644,646],{"class":217,"line":645},37,[215,647,648],{},"        fmt.Printf(\"Gelen Mesaj: %s\\n\", string(p))\n",[215,650,652],{"class":217,"line":651},38,[215,653,276],{"emptyLinePlaceholder":275},[215,655,657],{"class":217,"line":656},39,[215,658,659],{},"        \u002F\u002F Gelen mesajı aynı şekilde istemciye geri gönder (Echo)\n",[215,661,663],{"class":217,"line":662},40,[215,664,665],{},"        if err := conn.WriteMessage(messageType, p); err != nil {\n",[215,667,669],{"class":217,"line":668},41,[215,670,671],{},"            fmt.Println(\"Mesaj yazma hatası:\", err)\n",[215,673,675],{"class":217,"line":674},42,[215,676,631],{},[215,678,680],{"class":217,"line":679},43,[215,681,637],{},[215,683,685],{"class":217,"line":684},44,[215,686,583],{},[215,688,690],{"class":217,"line":689},45,[215,691,239],{},[215,693,695],{"class":217,"line":694},46,[215,696,276],{"emptyLinePlaceholder":275},[215,698,700],{"class":217,"line":699},47,[215,701,702],{},"func main() {\n",[215,704,706],{"class":217,"line":705},48,[215,707,708],{},"    http.HandleFunc(\"\u002Fws\", handleWebSocket)\n",[215,710,712],{"class":217,"line":711},49,[215,713,714],{},"    fmt.Println(\"WebSocket sunucusu :8080 portunda çalışıyor...\")\n",[215,716,718],{"class":217,"line":717},50,[215,719,720],{},"    http.ListenAndServe(\":8080\", nil)\n",[215,722,724],{"class":217,"line":723},51,[215,725,239],{},[14,727,728,729,736],{},"Kapak görseli: ",[18,730,731],{},[73,732,735],{"href":733,"rel":734,"target":80},"https:\u002F\u002Funsplash.com\u002F@hamishkale_?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[77,78,79],"Hamish Kale"," (Unsplash)",[92,738],{},[740,741,743],"h5",{"id":742},"bu-yazıda-yapılan-değişiklikler","Bu Yazıda Yapılan Değişiklikler",[22,745,746,749],{},[25,747,748],{},"11.05.2022: Yazı özeti düzenlendi.",[25,750,751,752,755],{},"21.06.2026: ",[32,753,754],{},"EnableCompression"," yorum satırındaki derleme hatasına yol açan eksik yorum işaretleri düzeltildi. Türkçe imla hataları (Amerika'yı, bir şeyler, başlayarak, protokol vb.) giderildi. Okuyucuların lokalde çalıştırabileceği güncel bir WebSocket sunucu (Echo Server) örnek kodu eklendi, TL;DR özet ve karşılaştırma tablosu entegre edildi.",[757,758,759],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":211,"searchDepth":224,"depth":224,"links":761},[762,763,764,765],{"id":97,"depth":230,"text":98},{"id":180,"depth":224,"text":181},{"id":244,"depth":224,"text":245},{"id":455,"depth":224,"text":456},[767],"technical",null,"2021-08-02","Gorilla WebSocket kütüphanesindeki websocket.Upgrader yapısının detaylı parametre incelemesi ve Go ile çalışan bir WebSocket sunucu örneği.",false,"md","\u002Fimages\u002Fhero\u002Fgo-websockets.avif",{},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir",{"title":6,"description":770},"go-ile-websockets-websocket-upgrader-nedir","tr\u002Fgo-ile-websockets-websocket-upgrader-nedir",[210,780],"websockets","2026-06-21","rv01Pd8y6UuKe8gKIvEZScjiXiSFG91542jDLGpQ390",{"prev":784,"next":787,"others":790,"lucky":911,"readingTime":236},{"path":785,"title":786},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder Tasarım Deseni Nedir?",{"path":788,"title":789},"\u002Ftr\u002Ffactory-method-ve-abstract-factory-farki-nedir","Factory Method ve Abstract Factory Farkı Nedir?",[791,794,797,800,803,806,809,812,815,818,821,824,827,830,833,836,839,842,845,848,851,854,857,860,863,866,869,872,875,878,881,884,887,890,893,896,899,902,905,908],{"path":792,"title":793},"\u002Ftr\u002Fjavascriptde-moduller","JavaScript'te Modüller",{"path":795,"title":796},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":798,"title":799},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator Tasarım Deseni Nedir?",{"path":801,"title":802},"\u002Ftr\u002Fubuntu-24-04-uzerinde-cyberpanel-kurulumu","Ubuntu 24.04 LTS ve 22.04 LTS Üzerinde CyberPanel Kurulumu",{"path":804,"title":805},"\u002Ftr\u002Flitespeed-web-server-performans-artisi","Konfor Alanından Çıkıp, Konforlu Bir VPS'e Geçmek: LiteSpeed Web Server",{"path":807,"title":808},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy Tasarım Deseni Nedir?",{"path":810,"title":811},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":813,"title":814},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":816,"title":817},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":819,"title":820},"\u002Ftr\u002Fmerhaba-phalcon-framework","Merhaba Phalcon Framework",{"path":822,"title":823},"\u002Ftr\u002Frabbitmq-nedir","RabbitMQ Nedir?",{"path":825,"title":826},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite Tasarım Deseni Nedir?",{"path":828,"title":829},"\u002Ftr\u002Ftailwind-css-just-in-time-modu","Tailwind CSS Just-in-Time (JIT) Modu Nedir?",{"path":831,"title":832},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":834,"title":835},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":837,"title":838},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy Tasarım Deseni Nedir?",{"path":840,"title":841},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton Tasarım Deseni Nedir?",{"path":843,"title":844},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":846,"title":847},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight Tasarım Deseni Nedir?",{"path":849,"title":850},"\u002Ftr\u002Frest-api-guvenligi-nasil-saglanir","REST Api Güvenliği Nasıl Sağlanır?",{"path":852,"title":853},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama",{"path":855,"title":856},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":858,"title":859},"\u002Ftr\u002Fphalcon-frameworkun-gelecegi","Phalcon Framework'ün Geleceği: Bir Devrin Sonu",{"path":861,"title":862},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":864,"title":865},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",{"path":867,"title":868},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method Tasarım Deseni Nedir?",{"path":870,"title":871},"\u002Ftr\u002Fes11-nedir-ecmascript-2020-nedir","ES11 Nedir? ECMAScript 2020 Nedir?",{"path":873,"title":874},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State Tasarım Deseni Nedir?",{"path":876,"title":877},"\u002Ftr\u002Fphp-8-0-yenilikler","Merhaba PHP 8: Modern PHP 8.x Çağı",{"path":879,"title":880},"\u002Ftr\u002Fdocker-ile-redis-kurulumu","Docker ile Redis Kurulumu",{"path":882,"title":883},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":885,"title":886},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":888,"title":889},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":891,"title":892},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility Deseni Nedir?",{"path":894,"title":895},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":897,"title":898},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi",{"path":900,"title":901},"\u002Ftr\u002Fapi-gateway-nedir","API Gateway Nedir? Ne İşe Yarar?",{"path":903,"title":904},"\u002Ftr\u002Fgo-ve-degiskenler","Go ve Değişkenler",{"path":906,"title":907},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter Tasarım Deseni Nedir?",{"path":909,"title":910},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":912,"title":913},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator Tasarım Deseni Nedir?",[915,919,921,925],{"path":916,"title":917,"date":918},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct","2021-10-14",{"path":885,"title":886,"date":920},"2021-10-13",{"path":922,"title":923,"date":924},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice","2021-10-10",{"path":843,"title":844,"date":924},[927,931,933],{"path":928,"title":929,"date":930},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler","2026-06-20",{"path":798,"title":799,"date":932},"2021-10-02",{"path":934,"title":935,"date":936},"\u002Ftr\u002Fdocker-nedir","Docker Nedir?","2021-01-06",1782142071775]