Alıcı ve Arayüz
Değer alıcılarına sahip yöntemler, hem değerleri hem de işaretçileri kullanarak çağrılabilir.
İşaretçi alıcılarına sahip yöntemler sadece işaretçiler veya adreslenebilir değerler kullanılarak çağrılabilir.
Örneğin,
type S struct {
data string
}
func (s S) Read() string {
return s.data
}
func (s *S) Write(str string) {
s.data = str
}
sVals := map[int]S{1: {"A"}}
// Sadece bir değer kullanarak Read çağrılabilir
sVals[1].Read()
// Aşağıdaki kod derlenmeyecektir:
// sVals[1].Write("test")
sPtrs := map[int]*S{1: {"A"}}
// Hem Read hem de Write metodları sadece bir işaretçi kullanılarak çağrılabilir
sPtrs[1].Read()
sPtrs[1].Write("test")
Benzer şekilde, bir yöntem değer alıcısına sahip olsa bile, bir arayüzü işaretçi alıcısıyla karşılayabilir.
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}
var i F
i = s1Val
i = s1Ptr
i = s2Ptr
// Aşağıdaki kod, s2Val'in bir değer olması ve S2'nin f yönteminin bir değer alıcısına sahip olmaması nedeniyle derlenmeyecektir
// i = s2Val
Effective Go, işaretçilerle değerlerin karşılaştırılması hakkında mükemmel açıklamalar içerir.
Ek notlar:
- Bir tür, değer alıcılarıyla bir yöntem setine ve işaretçi alıcılarıyla başka bir yöntem setine sahip olabilir.
- Değer alıcılarıyla yöntem seti, işaretçi alıcılarıyla yöntem setinin bir alt kümesidir, ancak tersi geçerli değildir.
- Kurallar
- Değer nesneleri yalnızca değer alıcılarıyla yöntem setini kullanabilir
- İşaretçi nesneler, değer alıcılarıyla yöntem setini + işaretçi alıcılarıyla yöntem setini kullanabilir
- Arayüz eşleme (veya uygulama)
- Tipler, arayüzün tüm yöntemlerini uygularsa arayüzle eşleşir
- Özellikle, ya türün değer yöntem setinin arayüzle eşleşmesi ya da işaretçi yöntem setinin arayüzle eşleşmesidir
İki özel eşleştirme türü bulunmaktadır:
- Değer yöntem setinin arayüzle eşleşmesi
- Değer veya işaretçi nesnesini bir arayüz değişkenine atamak sorun değildir çünkü her ikisi de değer yöntem setini içerir
- İşaretçi yöntem setinin arayüzle eşleşmesi
- Yalnızca bir işaretçi nesnesi, çünkü yalnızca işaretçi yöntem seti arayüzle eşleşir
- Değer nesnesi bir arayüz değişkenine atanırsa, derleme sırasında arayüz canlılık kontrol mekanizmasını tetikler
neden i = s2Val'nin bir hata tetiklediği konusuna gelince, bu, değer yöntem seti ve arayüzün eşleşmediği içindir.