“Go Context” Ortaya Karışık Yazılım Serisi — 11

Kemalcan Bora
3 min readFeb 24, 2022

Previously on Ortaya Karışık Yazılım Serisi (“Sarı Fil ve Arkadaşları Dövüş Kulübü Kuruyor.. Apache Spark’” Ortaya Karışık Yazılım Serisi — 10) => LINK

Uzun zamandır ara verdiğim “Ortaya Karışık Yazılım Serisi” yazılarıma en iyi öğrenme yolu yazmaktan geçer mottosu ile devam ediyorum. Son günlerde Go üzerine bir şeyler karalamaya çalışıyorum bir kaç tane çözemediğim ve zorlandığım konulara denk gelince en azından bunlara çalışırken dilim döndüğüncede yazıya döküp paylaşmanın daha doğru olacağına karar verdim, sonuçta hepimiz başka teknik yazıları okuyup manevi teknik borç sahibi olan kişileriz.

Peki bu Context kavramı nedir ?

Context, deadlines, cancellation sinyalleri, API sınırları ve süreçler arasında talep kapsamındaki diğer değerleri taşıyan bağlam türünü tanımlar. Aralarındaki işlev çağrıları zinciri, isteğe bağlı olarak WithCancel, WithDeadline, WithTimeout veya WithValue kullanılarak oluşturulan türetilebilir. Bir context iptal edildiğinde, ondan türetilen tüm contextler de iptal edilir.

Context.Background vs Context.TODO

Background(), context oluşturmak için genellikle ana veya ana iş parçacığında(thread) Nil olmayan boş bir context döndürür. Hiçbir zaman iptal edilmez, değeri yoktur ve deadline i yoktur. Genellikle ana işlev, başlatma ve testler tarafından ve gelen istekler için üst düzey Context olarak kullanılır.

TODO () boş bir context oluşturur ve ana veya ana iş parçacığında(thread) kullanılır ancak daha geniş bir uygulamaya sahiptir. Hangi context’i kullanacağınızdan emin olmadığınızda veya bir context almayı planladığınızda kullanabilirsiniz. [1]

Context.WithValue

Contextler için en yaygın kullanımlardan biri veri paylaşmak veya istek kapsamındaki(request-scoped) değerleri kullanmaktır. Birden çok işleviniz olduğunda ve bunlar arasında veri paylaşmak istediğinizde, bunu bağlamları kullanarak yapabilirsiniz. Bunu yapmanın en kolay yolu, context.WithValue işlevini kullanmaktır. Bu işlev, üst bağlama dayalı yeni bir bağlam oluşturur ve belirli bir anahtara bir değer ekler. İç uygulamayı bağlamda bir harita içeriyormuş gibi düşünebilirsiniz, böylece değerleri anahtarla ekleyebilir ve alabilirsiniz. Bu, context içinde her türlü veri depolamanıza olanak sağlar. [2]

WithTimeout vs WithDeadline

WithTimeout ve WithDeadline [3] temelde kullanım ve işlev açısından aynıdır, ikisi de contextin belirli bir süre sonra otomatik olarak iptal edileceğini gösterir, tek fark WithDeadline ikinci parametre tipi time.Duration türündendir, Örneğin, gelecekte belirli bir zamanda otomatik olarak iptal edilecek bir context oluşturabilir ve bunu alt işlevlerde iletebilirsiniz. Deadline nedeniyle bu context iptal edildiğinde, context alan tüm işlevler işi durdurmak ve geri dönmek için kullanılabilir. WithTimeout ise iptal işlevi çağrılırsa veya zaman aşımı süresi aşıldığında iptal edilen türetilmiş bir context döndürür. [4]

https://www.youtube.com/watch?v=mgJMIZsWfB4

Eğer kodlara bakarsak farkı daha rahat anlayabiliriz.Görüleceği üzere neredeyse hiç bir fark bulunmuyor.

Ortaya Karışık Yazılım Serisi’ne kendinizi yakın hissediyorsanız paylaşarak destek olabilirsiniz yaptığım hata ve öneriler için Twitter üzerinden ulaşabilirsiniz.

Referanslar

[1] https://www.programming-books.io/essential/go/context.todo-vs.context.background-d5224e27ff724a33a79cb4e03a5eb333.html

[2] https://dev.to/gopher/getting-started-with-go-context-l7g

[3] https://lebum.medium.com/understanding-and-usage-of-context-in-golang-6a460f9e8d2f

[4]http://p.agnihotry.com/post/understanding_the_context_package_in_golang/

--

--