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.