Bir Go bildiriminde "_" (alt çizgi virgül) nedir?


103

Ve bu tür bir değişken bildirimini anlayamıyorum:

_, prs := m["example"]

Tam olarak " _," ne yapıyor ve neden yerine böyle bir değişken bildirdiler

prs := m["example"]

( Örneklerle Git'in bir parçası olarak buldum : Haritalar )


3
Gelecekteki dil soruları için lütfen önce spesifikasyona bir göz atın . Tüm sorularınıza cevap vermelidir.
Fuz

Bir yorum olarak: prsmuhtemelen "şu an" anlamına gelir. Örneğinizdeki kod "example", mharitada bir girişin olup olmadığını kontrol ediyor .
dyoo

7
@FUZxxl Evet, daha önce oraya bir göz atmıştım ama özelliğin adını bilmediğim için bulamadım. Ayrıca, programlama dilleri için resmi özelliklerin çok pedagojik olmadığını ve daha çok örneklerle öğrenildiğini görüyorum.
Kansuler

@dyoo Aşağıdaki açıklamayı aldıktan sonra bunun anlamını anladım, ama aynı soruyu başka birinin sorması durumunda kayda değer!
Kansuler

8
@FUZxxl: Bilmiyorum. SO'da sorulan soruların çoğunun muhtemelen bir yerlerde yanıtları vardır . Altına bir soru sorulmaması gereken bir eşik var, ancak bu sorunun bunun altına düşeceğini sanmıyorum.
thb

Yanıtlar:


123

Dönen değerler için tüm değişkenleri bildirmek zorunda kalmaz. Boş tanımlayıcı
olarak adlandırılır .

De olduğu gibi:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

( diğer ' _' kullanım durumu içe aktarma içindir )

Dönüş değerini attığı için , " Etkili Git, harita " da gösterilen " Bir haritada anahtar varlığı nasıl test edilir? "

_, present := timeZone[tz]

Gerçek değer hakkında endişelenmeden haritada bulunup bulunmadığını test etmek için, boş bir tanımlayıcı, basit bir alt çizgi ( _) kullanabilirsiniz.
Boş tanımlayıcı, zararsız bir şekilde atılan değerle herhangi bir türden herhangi bir değerle atanabilir veya bildirilebilir.
Bir haritadaki mevcudiyeti test etmek için, değer için olağan değişken yerine boş tanımlayıcıyı kullanın.

Jsor'un yorumlara eklediği gibi :

"genel olarak kabul edilen standart", üyelik testi değişkenlerini "ok" olarak adlandırmaktır (aynı kanal okumasının geçerli olup olmadığını kontrol etmek için de geçerlidir)

Bu, test ile birleştirmenize izin verir:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

Bunu döngüde de bulabilirsiniz:

Aralıktaki (değer) yalnızca ikinci öğeye ihtiyacınız varsa, ilkini atmak için boş bir tanımlayıcı, bir alt çizgi kullanın:

sum := 0
for _, value := range array {
    sum += value
}

İyi bir örnek verdiğin için teşekkürler. Kavramı anlamak biraz düşünmemi gerektirdi, ama şimdi anlıyorum!
Kansuler

IME'nin "genel olarak kabul edilen standart" ın üyelik testi değişkenlerini "ok" olarak adlandırması gerektiğini unutmayın (kanal okumasının geçerli olup olmadığını kontrol etmek için de aynı).
LinearZoetrope

1
@Jsor Katılıyorum. Daha fazla görünürlük için yorumunuzu cevaba ekledim ve birkaç örnek daha ekledim.
VonC

68

Go derleyicisi asla kullanmadığınız değişkenler oluşturmanıza izin vermez.

for i, value := range x {
   total += value
}

Yukarıdaki kod, "bildirdim ve kullanılmadı" hata mesajı verecektir.

Döngümüzün içinde i kullanmadığımız için bunu şu şekilde değiştirmemiz gerekiyor:

for _, value := range x {
   total += value
}

15
İlk cümleniz, neden boş bir tanımlayıcı olarak _ olduğunu anlamak için önemliydi.
Tarık

4

_boş tanımlayıcıdır. Yani atanması gereken değer atılır.

Burada exampleatılan anahtarın değeridir . İkinci kod satırı, varlık boole değerini atacak ve değeri içinde saklayacaktır prs.
Bu nedenle, yalnızca haritada bulunup bulunmadığını kontrol etmek için değeri atabilirsiniz. Bu, bir haritayı set olarak kullanmak için kullanılabilir.


4

Sözdizimi bir değişken adı gerektirdiğinde, ancak program mantığı gerektirmediğinde boş tanımlayıcı kullanılabilir, örneğin, yalnızca öğe değerine ihtiyaç duyduğumuzda istenmeyen bir döngü indeksini atmak için.

Alıntı:

Go Programlama Dili (Addison-Wesley Profesyonel Hesaplama Serisi)

Brian W. Kernighan

Bu materyal telif haklarıyla korunuyor olabilir.


2

Boş tanımlayıcı olarak adlandırılır ve döndürülecek olan değeri atıp referans vermek istemediğiniz durumlarda yardımcı olur.

Kullandığımız bazı yerler:

  • Bir işlev bir değer döndürür ve gelecekte onu kullanmayı düşünmezsiniz
  • Yinelemek istiyorsunuz ve kullanmayacağınız bir i değerine ihtiyacınız var

2

Kullanılmayan değişken için harika kullanım durumu, yalnızca kısmi bir çıktıya ihtiyaç duyduğunuz durumdur. Aşağıdaki örnekte sadece değeri (eyalet nüfusu) yazdırmamız gerekiyor.

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

Temel _,olarak, boş tanımlayıcı olarak bilinir. GO'da kullanılmayan değişkenlere sahip olamayız.

Örnek olarak, bir dizi boyunca yineleme yaparken, değer: = aralık kullanıyorsanız , yineleme için bir i değeri istemezsiniz . Ancak i değerini atlarsanız, bir hata döndürür. Ama i ilan edip kullanmadıysanız, bu da bir hata verecektir.

Bu nedenle, kullanmamız gereken yer orasıdır _,.

Ayrıca gelecekte bir fonksiyonun dönüş değerini istemediğinizde de kullanılır.


0

Golang'da kullanılmayan bir değişkene izin verilmez

Başka programlama dillerinden geliyorsanız, buna alışmak biraz zor olabilir. Ancak bu, daha temiz bir kodla sonuçlanır. Yani a kullanarak, _orada bir değişken olduğunu bildiğimizi söylüyoruz ama onu kullanmak istemiyoruz ve derleyiciye bundan beni şikayet etmediğini söylüyoruz. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.