Go'da iki tür sabit vardır - tip belirtilmemiş (untyped) ve tip belirtilmiş (typed). Bu, dilin tip sistemlerini esnek ve güvenli hale getirme arzusuyla ilgilidir; derleyicinin hataları derleme aşamasında tespit etmesini sağlamak ve tür dönüşümünü yalnızca uygun olduğu yerlerde sağlamak.
Problemler ortaya çıkıyor, çünkü programcı bu iki kategoriyi ayırt edemiyor ve sabitlerin davranışına dayanan ve fonksiyon ve arayüzlerdeki tür gerekliliklerini göz önünde bulundurmayan bir yaklaşım benimseyebiliyor. Bu, türler arasında dönüşüm hatalarına, beklenmedik derleme hatalarına veya fonksiyon çağrıları sırasında beklenmedik "zıplama" uyumluluğuna yol açabilir.
Çözüm, açık bir şekilde anlamaktır:
const x int = 42) atandıktan sonra, bu sabit üzerindeki işlemler belirtilen tip ile sınırlıdır.Kodu örneği:
const Pi = 3.14 // tip belirtilmemiş const Answer int64 = 42 // tip belirtilmiş func printInt(a int) { fmt.Println(a) } func main() { printInt(Pi) // Hata: Pi int değil (ama açıkça dönüştürülebilir) printInt(int(Pi)) // Tamam printInt(Answer) // Tamam, çünkü Answer zaten int64 ve int64, int'e - açık dönüşüm }
Ana özellikler:
Tip belirtilmemiş bir sabite tam sayı türünde bir değişkene değer atamak, kayan nokta değerleri ile mümkün mü?
Hayır. Tip belirtilmemiş bir sabit iki farklı türde işlem için kullanılabilir, fakat bir float sabitini int türünde bir değişkene atamak derleme hatası verir. Açık bir dönüşüm gereklidir:
const Pi = 3.14 var x int = Pi // derleyici hata verir var y int = int(Pi) // Tamam
Tip belirtilmemiş bir sabitin tipi ilk atama işleminde belirlenir mi?
Hayır, sabit bir tipe sahip olmaz, sadece belirli bir türün beklendiği bağlamda veya açıkça tanımlanmadığı sürece. Diğer durumlarda tipi belirtilmemiş (untyped) kalır.
Tip belirtilmemiş türdeki büyük sayısal sabitleri, değeri karşılayacak şekilde, daha küçük boyutlu değişkenleri başlatmak için kullanabilir miyiz?
Evet, eğer modül değeri hedef tipin aralığına uyuyorsa. Aksi takdirde, derleyici taşma hatası verir.
Örnek:
const Big = 1 << 62 var x int32 = Big // Hata: Big int32'ye sığmaz var y int64 = Big // Tamam
Karmaşık bir finans projesinde, geliştiriciler belirli sabitleri (yüzdeler, katsayılar) tip belirtilmemiş olarak ilan ettiler. Bir süre sonra bazı fonksiyonların float32 yerine float64 istediği ortaya çıktı. Tip pozitifleme otomatik olarak, hesaplamalarda hassasiyet kaybına yol açtı ve bu hemen fark edilmedi.
Artılar:
Eksiler:
Sistemin diğer bir bölümünde, tüm sabitler açık tip tanımı ile düzenlenmiş ve dönüşümler açık bir şekilde yapılmıştır:
const Discount float64 = 0.05
Artılar:
Eksiler: