Bölüm 10/01: nil
nil
nil aslında ön tanımlı bir anahtar kelimde değil (25 anahtar kelimeden biri
değil, break, func vs...) Kendine ait özel bir değeri var. Aslında nil
şu tipler için uninitialized değeridir:
- Pointer
- Interface
- Map
- Slice
- Channel
- Function
Eğer identifier (değişken, sabit gibi) değeri nil ise nil o zaman
varolur. nil’in tipi yoktur, go ile beraber gelen ön tanımlı bir şey’dir.
Nerelerde Kullanılır
- pointer alan metot, fonksiyon’da argüman geçilmiş mi?
- struct
nilmi? - slice
nilmi? - map
nilmi? - error
nilmi? - channel
nilmi?
Ne zaman nil olunur?
- pointer eğer hiçbir yere point etmiyorsa
- slice’ın altında bir Array yoksa (underlying array)
- map, channel ya da fonksiyon henüz initialize edilmemişse (uninitialized ise)
- Interface’ler; eğer boş durumdaysalar ya da zero-value durumundaysalar ya da herhangi bir tipi karşılamıyorlarsa (milyon dolarlık cevap)
nil Pointer vs Pointer
var s *string // (nil) pointer, not allocated or initialized! points to a string value
var ss = new(string) // pointer but initialized, memory allocated, has a zero-value
nil as Value Receiver
https://go.dev/play/p/2NwTWYjudLz
package main
import "fmt"
// Numeros is a custom type
type Numeros struct {
nums []int
}
func sum(n ...int) int {
if len(n) == 0 {
return 0
}
return sum(n[1:]...) + n[0]
}
func (n *Numeros) Sum() int {
if n == nil {
return 0
}
return sum(n.nums...)
}
func main() {
n1 := Numeros{nums: []int{1, 2, 3}}
fmt.Println(n1.Sum()) // 6
n2 := Numeros{}
fmt.Println(n2.Sum()) // 0
}