2016-03-25 12 views
1

İki farklı zaman aşımı aralığına sahip, bir statik ve bir dinamik olan bazı eşzamanlı kodum var. Her ikisine de aynı şekilde tepki vermek istiyorum. Bunun özü:Git'de birden çok kanaldan girişe nasıl tepki veririm?

select { 
case <-time.After(staticTimeoutInterval): 
    doSomething() 
case <-time.After(dynamicTimeoutInterval): 
    doSomething() 
} 

doSomething() yöntemini yalnızca bir kez yazmak için herhangi bir yol var mı? Bu açıdan select'un switch kadar esnek olmaması garip.

+1

Zaman aşımı olabilir: = sTimeout; dTimeout twotwotwo

cevap

3

Eğer switch ve select görünüşte tutarsız tedavi Hakkında

timeout := min(staticTimeoutInterval, dynamicTimeoutInterval) 

select { 
case <-time.After(timeout): 
    doSomething() 
} 

func min(a, b time.Duration) int { 
    if a < b { 
     return a 
    } 
    return b 
} 

gibi bir şey kullanabilirsiniz - Bu ifadelerin benzer bir sözdizimi varken switch amacı, yürütme kollara iken select amacı iletişimdir.

abartmıyorum yapabiliyorsanız:

  • switch parçası hakkında case ifadesi sonrası - burada case ifadesi çoğunlukla
  • select parçası hakkında basit, yan etkisi ücretsiz ifadesidircase ifadesinde - case ifadesi burada önemli iletişim yan etkisini sağlar ve tüm
  • uygulamak için önemsiz değildir

select'daki geçişin izin vermesi bazı durumlarda birkaç satır kaydetmenize izin verir, ancak genellikle select deyimini nedenlerle ilgili olarak zorlaştırır. Diğer durumlarda benzer bir seçenek göz önüne alındığında, Go içerik oluşturucuları neredeyse her zaman daha ayrıntılı ve daha kolay anlaşılır hale gelmiştir.

0

Tam olarak neye bakıyorsunuz? select vakaları düşmemektedir. Ve eğer olduysa, berraklığı ortadan kaldıracak ve aynı sayıda kod satırına yol açacaktır. Belirli bir durumda

İlgili konular