Go'nun temel tipleri sayılar, boolean'lar ve string'lerdir. Her değişkenin derleme zamanında belirlenen tam olarak bir tipi vardır ve Go sizin yerinize tipler arasında asla dönüşüm yapmaz. %T herhangi bir değerin tipini yazdırır:
'G''nin int32 tipiyle 71 olarak yazdırıldığına dikkat edin: tek tırnaklı bir karakter bir rune'dur ve rune bir sayıdır (Unicode kod noktası). rune, int32 için bir takma addır (ikinci bir adla aynı tip), bu yüzden %T int32 raporlar. Aynı şekilde byte da uint8 raporlar.
Tam Sayılar
| Tip | Boyut | Aralık |
|---|---|---|
int8 | 8 bit | -128 ile 127 arası |
int16 | 16 bit | -32.768 ile 32.767 arası |
int32 | 32 bit | yaklaşık -2,1 milyar ile 2,1 milyar arası |
int64 | 64 bit | yaklaşık -9,2 kentilyon ile 9,2 kentilyon arası |
uint8 (byte) | 8 bit | 0 ile 255 arası |
uint16 | 16 bit | 0 ile 65.535 arası |
uint32 | 32 bit | 0 ile yaklaşık 4,3 milyar arası |
uint64 | 64 bit | 0 ile yaklaşık 18,4 kentilyon arası |
int, uint | 32 ya da 64 bit | platformun word boyutu |
uintptr | platform boyutu | alt seviye kod için bir pointer değeri tutar |
Varsayılan olarak int kullanın. len() bir int döndürür, slice indeksleri int'tir ve döngü sayaçları int'tir. Her 64 bit platformda int 64 bittir. Boyut bir sözleşmenin parçası olduğunda boyutlu tiplere başvurun: ikili bir dosya formatında int32, ham baytlar için uint8, nanosaniye cinsinden bir Unix zaman damgası için int64.
Sayılar gibi "negatif olamayan" miktarlar için işaretsiz tiplerden kaçının. Sıfırın altına düşen bir çıkarma, yakalayabileceğiniz negatif bir sayı üretmek yerine çok büyük bir sayıya sarar.
Sınırlar ve taşma
math paketinde her sınır için bir sabit vardır. Çalışma zamanında taşan tam sayı aritmetiği sessizce başa sarar:
Panic yok, hata yok: 127 + 1, -128 olur. Yalnızca sabit ifadeler derleme zamanında kontrol edilir (var b int8 = 128 derlenmez). Verinizde taşma olasılığı varsa işlemden önce kontrol edin ya da math/big kullanın.
Tam sayı literal'leri
million := 1_000_000 // underscores for readability (Go 1.13+)
mask := 0xFF // hexadecimal
perm := 0o755 // octal (also the older form 0755)
flags := 0b1010 // binary
Ondalıklı Sayılar
| Tip | Boyut | Hassasiyet |
|---|---|---|
float32 | 32 bit | yaklaşık 6 ila 9 anlamlı basamak |
float64 | 64 bit | yaklaşık 15 ila 17 anlamlı basamak |
Ondalık noktası ya da üssü olan bir literal (2.5, 1e6) varsayılan olarak float64'tür ve math paketi float64 alıp döndürür. Büyük bir dizide bellek önemli değilse bunu kullanın.
Float'lar ikili tabanda tutulur, bu yüzden çoğu ondalık kesir yaklaşık değerdir:
Buradan iki kural çıkar. Aritmetikten sonra float'ları asla == ile karşılaştırmayın. Ve parayı asla bir float'ta saklamayın: kuruş cinsinden bir tam sayı ya da bir decimal kütüphanesi kullanın.
Bir float'ı sıfıra bölmek panic yerine +Inf, -Inf ya da NaN verir. Bir tam sayıyı sıfıra bölmek çalışma zamanında panic'e yol açar (runtime error: integer divide by zero), sabit bir sıfır bölen ise derleme hatasıdır.
Boolean'lar
bool, true ya da false tutar ve sıfır değeri false'tur. Go sayıları, boş string'leri ya da nil'i boolean olarak görmez. if count {} derleme hatasıdır; if count > 0 {} yazın. Operatörler &&, || ve !'dir; && ve || kısa devre yapar.
String'ler
Bir string, genellikle UTF-8 metin olan değiştirilemez bir bayt dizisidir. len(s) karakterleri değil baytları sayar:
é UTF-8'de iki bayt tutar, bu yüzden len beş karakter için 6 raporlar. Çift tırnaklı string'ler \n gibi kaçış dizilerini işler; ters tırnaklı ham string'ler işlemez ve birden fazla satıra yayılabilir. strings sayfası strings paketini, runes and bytes sayfası da UTF-8'i derinlemesine anlatıyor.
byte ve rune
| Takma ad | Karşılığı | Tuttuğu |
|---|---|---|
byte | uint8 | bir baytlık ham veri |
rune | int32 | bir Unicode kod noktası |
Bunlar yeni tipler değil, takma adlardır: bir byte ile bir uint8 dönüşüm olmadan birbirinin yerine kullanılabilir. Adlar, sayının ne anlama geldiğini söyler.
Karmaşık Sayılar
Go'nun complex64 ve complex128 adında yerleşik karmaşık sayı tipleri vardır; real, imag ve math/cmplx paketiyle birlikte gelirler:
Az sayıda program bunlara ihtiyaç duyar, ama sinyal işleme ve bazı sayısal kodlar duyar.
Bileşik ve Referans Tipleri
Temel tipler bileşik tiplere dönüşür. Her birinin kendi sayfası var:
| Tip | Örnek | Sıfır değer |
|---|---|---|
| dizi | [3]int | üç sıfır |
| slice | []int | nil |
| map | map[string]int | nil |
| struct | struct{ X, Y int } | her alan sıfırlanmış |
| pointer | *int | nil |
| fonksiyon | func(int) int | nil |
| channel | chan int | nil |
| interface | error, any | nil |
any, interface{} için bir takma addır (Go 1.18'den beri) ve her tipten bir değer tutabilir.
Adlandırılmış Tipler
Var olan bir tipten yeni bir tip tanımlayabilirsiniz. Aynı temsile sahiptir ama ayrı bir tiptir ve metotları olabilir:
type Celsius float64
type UserID int64
var t Celsius = 21.5
var f float64 = t // compile error: cannot use t (variable of float64 type Celsius) as float64 value in variable declaration
Bu katılığın amacı şudur: bir UserID, OrderID beklenen bir yere yanlışlıkla verilemez. Bunu kastettiğinizde açıkça dönüştürün: float64(t). Kurallar için tip dönüşümü sayfasına, sayılar ile string'ler arasında geçiş için strconv fonksiyonlarına bakın.
Sıfır Değerler
Her tipin bir sıfır değeri vardır; bu, bir şey atamadan önce değişkenin tuttuğu değerdir: sayılar için 0, bool için false, string'ler için "" ve pointer'lar, slice'lar, map'ler, channel'lar, fonksiyonlar ve interface'ler için nil. Go'da ilk değeri verilmemiş değişken yoktur.
Sıkça Sorulan Sorular
Go'da int ne kadar büyüktür?
int ve uint, 64 bit platformlarda (amd64, arm64) 64 bit, 32 bit platformlarda 32 bittir. Bir dosya formatı ya da ağ protokolü için sabit bir boyuta ihtiyacınız varsa int32, int64, uint8 gibi tipleri kullanın. Sıradan sayaçlar, indeksler ve uzunluklar için int kullanın.
Go'da bir değişkenin tipi nasıl yazdırılır?
%T verb'ünü kullanın: fmt.Printf("%T\n", x); int, float64, []string, main.User gibi değerler yazdırır. Kod içinde reflect.TypeOf(x) aynı bilgiyi inceleyebileceğiniz bir değer olarak döndürür.
Go'da byte ile rune arasındaki fark nedir?
byte, uint8 için bir takma addır ve bir baytlık ham veri tutar. rune, int32 için bir takma addır ve bir Unicode kod noktası tutar. Bir string bayt dizisidir; üzerinde for range ile dolaşmak onu rune'lara çözer.
Go'da float32 mi yoksa float64 mü kullanmalıyım?
Bir nedeniniz yoksa float64 kullanın. Ondalıklı literal'lerin varsayılan tipidir, math paketinin çalıştığı tiptir ve float32'nin yaklaşık 6 ila 9 anlamlı basamağına karşılık yaklaşık 15 ila 17 anlamlı ondalık basamak hassasiyeti vardır. float32'yi yalnızca büyük dizilerde belleği yarıya indirmek ya da harici bir formata uymak için seçin.
Go'da int'in maksimum değeri nedir?
math paketindeki sabitleri kullanın: math.MaxInt (64 bit platformlarda 9223372036854775807), math.MinInt, math.MaxInt64, math.MaxUint32 ve diğerleri. Sınırı aşan aritmetik çalışma zamanında sessizce başa sarar; panic oluşmaz.