Spec mengatakan:

Kumpulan metode dari suatu tipe menentukan antarmuka yang diimplementasikan oleh tipe tersebut dan metode yang dapat dipanggil menggunakan penerima dari tipe tersebut.


Jadi, untuk memverifikasi poinnya, di bawah ini adalah kodenya:

package main

import "fmt"

// I interf
type I interface {
    hello()
    goodbye()
}

// T type
type T struct {
    name string
}

func (t T) hello() {
    fmt.Println("Hello", t.name)
}

func (t *T) goodbye() {
    fmt.Println("Goodbye", t.name)
}

func main() {
    var t1 T = T{"James"}
    t1.hello()
    t1.goodbye()
}

t1.goodbye() berfungsi meskipun metode goodbye() bukan bagian dari kumpulan metode dari jenis T. Karena, t1.goodbye() berfungsi secara internal sebagai (&t1).goodbye() yang memenuhi aturan di bawah ini:

Jika Anda memiliki T dan tidak dapat dialamatkan, Anda hanya dapat memanggil metode yang memiliki tipe penerima T, bukan *T.


Tetapi, menurut spesifikasi, pemanggilan metode mengikuti aturan di bawah ini:

Kumpulan metode dari suatu tipe menentukan antarmuka yang diimplementasikan oleh tipe tersebut dan metode yang dapat dipanggil menggunakan penerima dari tipe tersebut.

Apakah pemanggilan t1.goodbye() sebagai (&t1).goodbye() melanggar aturan pemanggilan metode?

go
-4
overexchange 31 Oktober 2020, 07:24

1 menjawab

Jawaban Terbaik

Dari Panggilan di spesifikasi...

Pemanggilan metode x.m() valid jika kumpulan metode (tipe) x berisi m dan daftar argumen dapat ditetapkan ke daftar parameter m. Jika x dapat dialamatkan dan set metode &x berisi m, x.m() adalah singkatan untuk (&x).m()

  • t1 dapat dialamatkan.
  • Kumpulan metode &t1 berisi selamat tinggal().
  • t1.selamat tinggal() adalah singkatan dari (&t1).selamat tinggal().
1
Schwern 31 Oktober 2020, 04:53