Golang'da uzun bir kod satırı nasıl kırılır?


111

Python'dan geliyorum, 80 sütundan daha uzun kod satırları görmeye alışkın değilim. Yani bununla karşılaştığımda:

err := database.QueryRow("select * from users where user_id=?", id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

Kırmaya çalıştım

err := database.QueryRow("select * from users where user_id=?", id) \
    .Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

Ama anlıyorum

 syntax error: unexpected \

Ayrıca enter tuşuna basarak satırı kırmayı denedim ve sonuna bir noktalı virgül koydum:

err := database.QueryRow("select * from users where user_id=?", id) 
.Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email);

Ama yine anlıyorum:

syntax error: unexpected .

Öyleyse bunu yapmanın golangic yolu nedir merak ediyorum?

Yanıtlar:


124

Önce biraz arka plan. Go'nun biçimsel dilbilgisi, ";"birçok yapımda sonlandırıcı olarak noktalı virgül kullanır , ancak Go programları bunların çoğunu atlayabilir (ve daha net, kolay okunabilir bir kaynağa sahip olmaları gerekir; gofmtayrıca gereksiz noktalı virgülleri kaldırır).

Spesifikasyon kesin kuralları listeler. Spec: Noktalı virgül:

Biçimsel dilbilgisi noktalı virgül ";" bir dizi yapımda sonlandırıcılar olarak. Go programları, aşağıdaki iki kuralı kullanarak bu noktalı virgüllerin çoğunu atlayabilir:

  1. Girdi jetonlara bölündüğünde, bir satırın son jetonundan hemen sonra jeton akışına otomatik olarak bir noktalı virgül eklenir.

  2. Karmaşık ifadelerin tek bir satırı işgal etmesine izin vermek için, ")" veya "}" kapanışından önce bir noktalı virgül atlanabilir.

Gördüğünüz gibi, parantezden sonra bir yeni satır karakteri eklerseniz ), ;otomatik olarak bir noktalı virgül eklenir ve böylece sonraki satır, önceki satırın devamı olarak değerlendirilmez. Sizin durumunuzda olan budur ve bu nedenle ile başlayan bir sonraki satır .Scan(&ReadUser.ID,...size derleme zamanı hatası verecektir çünkü bu tek başına (önceki satır olmadan) bir derleme zamanı hatasıdır:syntax error: unexpected .

Dolayısıyla, 1.yukarıdaki maddede listelenen kurallarla çelişmeyen herhangi bir noktada çizginizi kırabilirsiniz .

Genelde virgülden sonra çizgileri kırabilir ,sonra, açılış parantezi örneğin (, [, {, ve bir nokta sonrasında .bazı değerin bir alanı veya yöntemi referans olabilir. Ayrıca, ikili operatörlerden sonra (2 işlenen gerektiren) satırınızı da bölebilirsiniz, örneğin:

i := 1 +
        2
fmt.Println(i) // Prints 3

Burada dikkat edilmesi gereken bir nokta, ilk değerleri listeleyen bir yapı veya dilim veya harita hazır bilgisine sahipseniz ve son değeri listeledikten sonra satırı kırmak istiyorsanız, bu son değer ,olmasına ve hayır daha fazlası takip edecek, örneğin:

s := []int {
    1, 2, 3,
    4, 5, 6,  // Note it ends with a comma
}

Bu, noktalı virgül kurallarına uymak ve ayrıca son virgül eklemeye / çıkarmaya gerek kalmadan yeniden düzenleyip yeni satırlar ekleyebilmeniz içindir; örneğin, kaldırıp yeni bir virgül eklemek zorunda kalmadan 2 satırı kolayca değiştirebilirsiniz:

s := []int {
    4, 5, 6,
    1, 2, 3,
}

Aynısı, bir işlev çağrısına argümanlar listelenirken de geçerlidir:

fmt.Println("first",
    "second",
    "third",       // Note it ends with a comma
)

3
Javascript değişmezlerinin sonuna virgül koyuyorum. #hatejs
Paulo Scardine

29
TL; DR: Tipik olarak, satırlarınızı virgülden sonra, parantezi açtıktan sonra, örneğin (, [, {, ve bir noktadan sonra. Bu, belirli bir değere sahip bir alanı veya yöntemi referans gösteriyor olabilir.
Peeter Kokk

2
Sonunda fazladan virgül eklemek zorunda kalmak bana bazı eski IE js hatalarını hatırlatıyor, korkunç
Christophe Roussy

5
@ChristopheRoussy Öznel, bir aşk için tüm satırların virgülle bitmesi gerektiğidir ve virgül eklemeye / çıkarmaya gerek kalmadan kolaylıkla yeniden düzenleyebilir ve yeni satırlar ekleyebilirim.
icza

@icza, virgülle bitmelerini de seviyorum, ancak sonuncusu için yapmak zorunda kalmamalarını seviyorum :)
Christophe Roussy

23

En basit yol, operatörü ( .) ilk satırda bırakmaktır .

\ Birçok python stil kılavuzunda satır devam ettirmeleri önerilmemektedir, bu teknik her iki dilde de çalıştığından go ve python arasında gidip gelirseniz tüm ifadeyi parantez içine alabilirsiniz.


Operatörü sonunda bırakmakla ilgili güzel bir ipucu. İşe yaradı.
Karlom

1
parantez içine sarma, go afaik'te çalışmaz. Yine de noktalı virgülü parantez içine ekleyin
Adrian Shum

Daha yeni denedim ve Go gerçekten parantez içinde bile görünmez bir noktalı virgül ekliyor. Yani bu sadece Python'da çalışır, Go'da değil.
Roland Illig

@RolandIllig Bu kesinlikle işe yarıyor: play.golang.org/p/oFKaxLTphU
tobyodavies

İfadelerim için üzgünüm, parantez kullanımından bahsediyordum (ama bunu yazmadım). İfadeyi parantez içine almak Python'da çalışabilir, ancak Go'da çalışmaz.
Roland Illig

17

Belirtildiği gibi, bu bir stil tercihi meselesidir. Go'nun yaratıcılarının kendi deneyimlerine dayanarak öğrendiğim ama aynı zamanda kendi tarzımın bazılarını deneyimlerimden sakladığım bir stil önerdiğini anlıyorum.

Aşağıda bunu nasıl biçimlendireceğim:

err := database.
  QueryRow("select * from users where user_id=?", id).
  Scan(
    &ReadUser.ID,
    &ReadUser.Name,
    &ReadUser.First,
    &ReadUser.Last,
    &ReadUser.Email,
  )

16

Bu bir stil meselesi, ama hoşuma gitti:

err := database.QueryRow(
    "select * from users where user_id=?", id,
).Scan(
    &ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email,
)
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.