Rumah >pembangunan bahagian belakang >Golang >Mengapa Kaedah Antara Muka Go Saya Jenis Pulangan Menyebabkan Ralat Penyusunan?

Mengapa Kaedah Antara Muka Go Saya Jenis Pulangan Menyebabkan Ralat Penyusunan?

Linda Hamilton
Linda Hamiltonasal
2024-11-09 22:38:02818semak imbas

Why Does My Go Interface Method Return Type Cause a Compilation Error?

Kaedah Antara Muka Jenis Kembali sebagai Antara Muka dalam Go

Soalan:

Melaksanakan antara muka kaedah yang mengembalikan jenis antara muka dalam Golang boleh menyebabkan ralat penyusunan. Pertimbangkan kod berikut:

type IA interface {
    FB() IB
}

type IB interface {
    Bar() string
}

type A struct {
    b *B
}

func (a *A) FB() *B {
    return a.b
}

type B struct{}

func (b *B) Bar() string {
    return "Bar!"
}

Menjalankan kod ini menyebabkan ralat berikut:

cannot use a (type *A) as type IA in function argument:
    *A does not implement IA (wrong type for FB method)
        have FB() *B
        want FB() IB

Penyelesaian:

Untuk menyelesaikan isu ini , jenis pemulangan kaedah FB mesti sepadan dengan jenis yang dinyatakan dalam antara muka IA. Oleh itu, perubahan berikut diperlukan:

func (a *A) FB() IB {
    return a.b
}

Dengan pengubahsuaian ini, kod akan berjaya disusun kerana jenis pemulangan FB kini ialah IB, seperti yang ditakrifkan dalam antara muka IA.

Pertimbangan Tambahan:

Jika antara muka IA dan IB ditakrifkan dalam pakej berasingan, penyataan import untuk pakej yang mengandungi IB mesti disertakan dalam fail di mana kaedah FB dilaksanakan. Selain itu, jenis pemulangan FB mesti memenuhi syarat dengan nama pakej yang sesuai:

import (
    "foo" // Package containing IB interface
)

// Implementation in package bar
func (a *A) FB() foo.IB {
    return a.b
}

Atas ialah kandungan terperinci Mengapa Kaedah Antara Muka Go Saya Jenis Pulangan Menyebabkan Ralat Penyusunan?. 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