Arayüzler için İşaretçiler
Neredeyse asla bir arayüz türleri için işaretçilere ihtiyacınız olmayacak. Arayüzleri değer olarak geçirmelisiniz, böyle yaparak geçirilen temel veri hala bir işaretçi olabilir.
Arayüzler temel düzeyde iki alanla temsil edilir:
- Belirli bir tür bilgisine işaret eden bir işaretçi. Bunu "tür" olarak düşünebilirsiniz.
- Veri işaretçisi. Depolanan veri bir işaretçi ise, doğrudan depolanır. Depolanan veri bir değer ise, o değerin işaretçisi depolanır.
Eğer arayüz yöntemlerinin temel veriyi değiştirmesini istiyorsanız, işaretçi alıcılarını kullanmalısınız (nesne işaretçisini arayüz değişkenine atayın).
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
// f1.f() temel veriyi değiştiremez
// f2.f() temel veriyi değiştirebilir, nesne işaretçisi arayüz değişkenine atandı
var f1 F = S1{}
var f2 F = &S2{}
Asla arayüzler için işaretçi kullanmayın, bu anlamsızdır. Go dilinde, arayüz kendisi bir referans türüdür. Başka bir deyişle, arayüz türü kendisi bir işaretçidir. İhtiyaçlarım doğrultusunda, test için parametre sadece myinterface olmalıdır ve değeri iletmek için sadece bir *mystruct türü (*mystruct türü sadece iletilmeli) gereklidir.
type myinterface interface{
print()
}
func test(value *myinterface){
//bir şeyler yap ...
}
type mystruct struct {
i int
}
// Arayüzü uygula
func (this *mystruct) print(){
fmt.Println(this.i)
this.i=1
}
func main(){
m := &mystruct{0}
test(m) // Yanlış
test(*m) // Yanlış
}