Rumah > pembangunan bahagian belakang > Golang > Mengapa Fungsi Go Tidak Mengembalikan Struktur Melaksanakan Antara Muka Memenuhi Medan Fungsi Mengembalikan Antara Muka?

Mengapa Fungsi Go Tidak Mengembalikan Struktur Melaksanakan Antara Muka Memenuhi Medan Fungsi Mengembalikan Antara Muka?

DDD
Lepaskan: 2024-12-05 12:53:16
asal
540 orang telah melayarinya

Why Doesn't a Go Function Returning a Struct Implementing an Interface Satisfy an Interface-Returning Function Field?

Jenis Fungsi Go Mengembalikan Struktur Tidak Serasi dengan Antara Muka

Soalan:

In Go, kenapa adakah fungsi mengembalikan struct yang melaksanakan antara muka tidak memenuhi keperluan jenis medan yang menjangkakan fungsi mengembalikan antara muka itu?

Jawapan:

Masalahnya terletak pada hakikat bahawa jenis fungsi Go yang mengembalikan struct tidak boleh ditukar ganti dengan jenis fungsi yang mengembalikan antara muka, walaupun struct melaksanakan antara muka. Apabila mengisytiharkan tandatangan jenis untuk fungsi dalam struktur, jenis pulangan tertentu mesti sepadan dengan jenis yang diisytiharkan. Mengubah suai fungsi kilang untuk mengembalikan jenis antara muka secara langsung menyelesaikan isu.

Contoh:

package main

import "fmt"

func main() {
    thing := structToConstruct{getInstance}
    thing.performAction()
}

type myInterface interface {
    doSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}

func (s *structToConstruct) performAction() {
    instance := s.factoryFunction()
    instance.doSomething()
}

func getInstance() myInterface {
    return &myStruct{}
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}
Salin selepas log masuk

Dalam contoh ini, fungsi kilang diubah suai untuk mengembalikan tika myInterface, yang memenuhi keperluan jenis untuk structToConstruct.

Penjelasan:

Apabila mengisytiharkan jenis structToConstruct, kami menyatakan bahawa factoryFunction sepatutnya menjadi fungsi yang mengembalikan myInterface. Walau bagaimanapun, fungsi mahal.CreateInstance mengembalikan nilai *myStruct, yang tidak boleh diserahkan terus kepada myInterface. Ini kerana antara muka Go menyediakan keselamatan jenis dan fungsi yang mengembalikan jenis struct tertentu (cth., *myStruct) tidak boleh ditukar secara automatik kepada fungsi yang mengembalikan jenis antara muka yang ia laksanakan.

Untuk menggunakan *myStruct nilai dengan myInterface, kita mesti menukarnya secara eksplisit menggunakan penegasan jenis atau dengan mencipta fungsi penyesuai yang membungkus penukaran:

func wrapper() myInterface {
    return expensive.CreateInstance()
}

thing := structToConstruct{wrapper}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Fungsi Go Tidak Mengembalikan Struktur Melaksanakan Antara Muka Memenuhi Medan Fungsi Mengembalikan Antara Muka?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan