Penerima dan Antarmuka
Metode dengan penerima nilai dapat dipanggil menggunakan baik nilai maupun pointer.
Metode dengan penerima pointer hanya dapat dipanggil menggunakan pointer atau nilai yang dapat dijangkau.
Sebagai contoh,
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"}}
// Anda hanya dapat memanggil Read menggunakan nilai
sVals[1].Read()
// Ini tidak akan dikompilasi:
// sVals[1].Write("test")
sPtrs := map[int]*S{1: {"A"}}
// Baik metode Read maupun Write dapat dipanggil menggunakan pointer
sPtrs[1].Read()
sPtrs[1].Write("test")
Demikian pula, meskipun sebuah metode memiliki penerima nilai, ia dapat memenuhi sebuah antarmuka menggunakan penerima pointer.
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
// Kode berikut tidak akan dikompilasi karena s2Val merupakan nilai dan metode f dari S2 tidak memiliki penerima nilai
// i = s2Val
Effective Go berisi penjelasan yang sangat baik tentang pointer vs. nilai.
Catatan tambahan:
- Sebuah tipe dapat memiliki set metode dengan penerima nilai dan set metode dengan penerima pointer
- Set metode dengan penerima nilai merupakan subset dari set metode dengan penerima pointer, namun tidak sebaliknya
- Aturan
- Objek nilai hanya dapat menggunakan set metode dengan penerima nilai
- Objek pointer dapat menggunakan set metode dengan penerima nilai + set metode dengan penerima pointer
- Cocokan antarmuka (atau implementasi)
- Tipe cocok dengan antarmuka jika tipe tersebut mengimplementasikan semua metode antarmuka itu
- Secara khusus, baik set metode nilai tipe cocok dengan antarmuka atau set metode pointer cocok dengan antarmuka
Ada dua jenis pencocokan khusus:
- Set metode nilai cocok dengan antarmuka
- Tidak masalah untuk mengassign objek nilai atau pointer ke variabel antarmuka karena keduanya mengandung set metode nilai
- Set metode pointer cocok dengan antarmuka
- Hanya objek pointer yang dapat diassign ke variabel antarmuka karena hanya set metode pointer yang cocok dengan antarmuka
- Jika objek nilai diassign ke variabel antarmuka, itu akan memicu mekanisme pengecekan kelayakan antarmuka selama kompilasi
Mengapa i = s2Val memicu sebuah error, hal tersebut dikarenakan set metode nilai dan antarmuka tidak cocok.