Rumah >pembangunan bahagian belakang >Golang >Mengapakah Kaedah Penetap Antara Muka Go Memerlukan Penunjuk?

Mengapakah Kaedah Penetap Antara Muka Go Memerlukan Penunjuk?

Barbara Streisand
Barbara Streisandasal
2024-11-23 11:35:26193semak imbas

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
}

Percubaan untuk melaksanakan keputusan kaedah Set dalam sebuah ralat:

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

Penyelesaian

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

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

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())
}

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!

Kenyataan:
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