Skip to content

Go Sabitler

Sabitlerin değeri çalışma zamanında değiştirilemez, bir kez atandıktan sonra değiştirilemez. Değeri sadece şunlardan gelebilir:

  • Değişmezler (literals)
  • Diğer sabit tanıtıcıları
  • Sabit ifadeler
  • Sonucu sabit olan tür dönüşümleri
  • iota

Sabitler sadece temel veri türleri olabilir, şunlar olamaz:

  • Temel türler dışındaki diğer türler, örneğin struct, interface, slice, array vb.
  • Fonksiyon dönüş değerleri

Sabitlerin değeri değiştirilemez, aksi takdirde derleme başarısız olur.

Başlatma

Sabit tanımlaması için const anahtar kelimesi kullanılır. Sabit tanımlanırken mutlaka bir değer atanmalıdır ve sabitin türü atlanabilir, örneğin:

go
const name string = "Jack" // değişmez

const msg = "hello world" // değişmez

const num = 1 // değişmez

const numExpression = (1+2+3) / 2 % 100 + num // sabit ifade

Sadece tanımlama yapılıp değer belirtilmezse, derleme başarısız olur:

go
const name string

Derleyici hatası:

missing init expr for name

Sabitleri toplu olarak tanımlarken okunabilirliği artırmak için () ile çevrilebilir, gruplama efekti elde etmek için birden fazla () bulunabilir.

go
const (
   Count = 1
   Name  = "Jack"
)

const (
   Size = 16
   Len  = 25
)

Aynı sabit grubunda, değeri atanmış sabitten sonraki sabitlere değer atanmayabilir, değerleri varsayılan olarak öncekinin değeridir, örneğin:

go
const (
  A = 1
  B // 1
  C // 1
  D // 1
  E // 1
)

iota

iota yerleşik bir sabit tanıtıcıdır, genellikle bir sabit tanımlamasındaki türsüz tamsayı sırasını temsil etmek için kullanılır, genellikle parantez içinde kullanılır.

go
const iota = 0

Birkaç kullanım örneğine bakalım:

go
const (
   Num = iota // 0
   Num1 // 1
   Num2 // 2
   Num3 // 3
   Num4 // 4
)

Şu şekilde de yazılabilir:

go
const (
   Num = iota*2 // 0
   Num1 // 2
   Num2 // 4
   Num3 // 6
   Num4 // 8
)

Şu şekilde de olabilir:

go
const (
   Num = iota << 2*3 + 1 // 1
   Num1 // 13
   Num2 // 25
   Num3 = iota // 3
   Num4 // 4
)

Yukarıdaki birkaç örnekten görülebileceği gibi, iota artandır. İlk sabit iota değerinin ifadesini kullanır, sıra numarası değişimine göre sonraki sabitlere otomatik olarak atanır, yeni bir const ile sıfırlanana kadar devam eder. Bu sıra numarası aslında kodun göreli satır numarasıdır, mevcut grubun başlangıç satırına göre görelidir. Aşağıdaki örneğe bakalım:

go
const (
  Num  = iota<<2*3 + 1 // 1 birinci satır
  Num2 = iota<<2*3 + 1 // 13 ikinci satır
  _ // 25 üçüncü satır
  Num3 //37 dördüncü satır
  Num4 = iota // 4 beşinci satır
  _ // 5 altıncı satır
  Num5 // 6 yedinci satır
)

Örnekte anonim tanıtıcı _ bir satır yer kaplar, görülebilir ki iota değeri doğası gereği iota'nın bulunduğu satırın mevcut const grubunun ilk satırına göre farkıdır. Farklı const grupları birbirini etkilemez.

Enum

Go dili enum için ayrı bir veri türü tasarlamamıştır, diğer diller gibi genellikle bir enum表示 yoktur. Genellikle Go'da, özel tür + const + iota ile enum实现 edilir. Aşağıda basit bir örnek verilmiştir:

go
type Season uint8

const (
  Spring Season = iota
  Summer
  Autumn
  Winter
)

Bu enumlar aslında sayılardır, Go bunları doğrudan string'e dönüştürmeyi desteklemez, ancak özel türe metod ekleyerek string temsilini döndürebiliriz, Stringer arayüzünü uygulayarak.

go
func (s Season) String() string {
  switch s {
  case Spring:
    return "ilkbahar"
  case Summer:
    return "yaz"
  case Autumn:
    return "sonbahar"
  case Winter:
    return "kış"
  }
  return ""
}

Böylece basit bir enum实现 edilmiş olur. Ayrıca resmi araç Stringer ile enum otomatik olarak oluşturabilirsiniz.

Ancak bunun dezavantajları vardır:

  • Tür güvenli değil, çünkü Season özel bir türdür, diğer sayıları da bu türe zorla dönüştürebilirsiniz

    go
    Season(6)
  • Karmaşık, string temsili kendiniz uygulamanız gerekir

  • İfade yeteneği zayıf, çünkü const sadece temel veri türlerini destekler, bu yüzden bu enum değerleri de sadece string ve sayı ile temsil edilebilir

Neden dil düzeyinde enum desteklenmediği yazarın anlayamadığı bir şeydir, bence bu kesinlikle fayda zarardan büyüktür.

Golang by www.golangdev.cn edit