Mengapakah Kaedah Penetap Antara Muka Go Memerlukan Penunjuk?

Barbara Streisand
Lepaskan: 2024-11-23 11:35:26
asal
116 orang telah melayarinya

Why Do Go's Interface Setter Methods Require Pointers?

Polimorfisme dalam Go: Pelaksanaan Antara Muka

Walaupun Go tidak menyokong polimorfisme tradisional, antara muka menyediakan cara untuk mencapai kesan yang serupa. Walau bagaimanapun, batasan wujud apabila melaksanakan kaedah penetap.

Masalahnya

Pertimbangkan kod berikut:

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this MyStruct) Get() int {
    return this.data
}
Salin selepas log masuk

Percubaan untuk melaksanakan keputusan kaedah Set dalam sebuah ralat:

func (this MyStruct) Set(i int) {
    this.data = i
}
Salin selepas log masuk

Penyelesaian

Untuk memintas pengehadan ini, penerima dalam kaedah Set mestilah penunjuk, seperti dalam:

func (this *MyStruct) Set(i int) {
    this.data = i
}
Salin selepas log masuk

Ini membolehkan kaedah mengubah suai data asas, yang ditunjukkan dalam antara muka pembolehubah.

Kod Dibetulkan

Kod diperbetulkan berikut berfungsi seperti yang dimaksudkan:

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this *MyStruct) Get() int {
    return this.data
}

func (this *MyStruct) Set(i int) {
    this.data = i
}

func main() {
    s := &MyStruct{123}
    fmt.Println(s.Get())

    s.Set(456)
    fmt.Println(s.Get())

    var mi MyInterfacer = s
    mi.Set(789)
    fmt.Println(mi.Get())
}
Salin selepas log masuk

Walaupun bukan polimorfisme sebenar, teknik ini membenarkan yang serupa tahap fleksibiliti melalui pelaksanaan antara muka dalam Go.

Atas ialah kandungan terperinci Mengapakah Kaedah Penetap Antara Muka Go Memerlukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan