2015-07-06 23 views
14
0BNB: Tek yönlü kanalları ne zaman kullanacağınızı anladığımdan bu, this sorusunun bir kopyası değil. Ben her zaman yaparım. bu program neden geçerli olduğunu Sorum şu:

Tek yönlü bir kanalı "yapmak" için bir amaç var mı?

func main() { 
    ch := make(chan<- int) 
    ch <- 5 
    fmt.Println("Hello, playground") 
} 

Playground

elbette bir kilitlenme verir, bunu yayınlanıyor. Eğer türü% T ile kontrol ederseniz, Go aslında ch türünün sadece bir gönderen kanal olduğunu bildirir. Go'da, make tek yönlü kanallara izin verilir, ancak çok az anlam ifade eder, çünkü başlangıçta tek yönlü bir kanal hazırlayarak, okuma/yazma işlemlerinden en az birinin asla gerçekleşmeyeceğini garanti edersiniz.

Olası bir açıklama, bir goroutinin asılmasına zorlamak olabilir ama bu, select {} ile kolayca yapılabilir.

Benim sadece diğer fikri sadece bir şey n kez yapılacak bir goroutine zorlamak için

ch := make(chan<- int, 50) 
// do something 50 times, since then the buffer is full 
for { 
    ch <- doSomething() 
} 

olduğunu Ama bu farklı yapılar herhangi bir sayı ile gerçekleştirilir, daha az karışıklığa bahsetmiyorum, daha kolay bulunuyor.

Bu sadece tip sistemde bir tuhaflık/gözetleme midir, yoksa bu davranış için var mıdır diye düşünmüyorum?

+1

Ben sadelik git tasarım hedeflerinden biri inanıyoruz:

package main func main() { ch := make(chan<- int) ch <- 5 } 

İşte bazı daha geçerli saçmalık:

Sen bazı geçerli saçma yazdım. Dil özellikleri çok kısa. Bunun saçmalık yapıların maliyetinde basitlik örneği olabileceğine inanıyorum. – ReyCharles

+2

@ReyCharles Bu nedenle şunu söyleyebilirim: "var ch chan <- int = make (chan int)" geçerli, ancak 'make' davranışı oldukça açık ve kapsamlı bir şekilde speküle edilmiş özel bir yapıdır. Basitliğin bir sonucundan ziyade bir gözetim olduğunu düşünüyorum. – LinearZoetrope

+8

Sanırım bunu yapmak istemeyeceğiniz bir şey. (Ya da en azından, bunun için bir kullanım ile gelen bir kişi bugünkü Go Pub Trivia ™ 'yı kazanır.) Ancak, @ReyCharles'in söylediklerinin satırları boyunca, teknik özelliklerin tüm anlamsız yapıları dışlaması gerekmemektedir. Go, C'nin (örneğin kullanılmayan vars) bulunmadığı bazı saçmalık biçimlerini önlemeye çalışır; Pas, bazı saçmalıkları hariç tutmaya çalışan statik kontrollere sahiptir. Mutlu bir şekilde derleme yapın (ör., Irklar). Tamam, ve çoğunlukla ara sıra tuhaflık çekiyor ve bir şeyler yapmaya çalışıyoruz. – twotwotwo

cevap

3

Bir dile sahipsiniz: sözcükler (belirteçler) ve bir dilbilgisi. Her zaman geçerli saçmalık yazabilirsiniz: Mavi bir renk değildir.

package main 

func main() { 
    for { 
    } 
} 
İlgili konular