Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Struktur Pemulangan Jenis Fungsi Go Boleh Digunakan untuk Pelaksanaan Antara Muka?

Bagaimanakah Struktur Pemulangan Jenis Fungsi Go Boleh Digunakan untuk Pelaksanaan Antara Muka?

Mary-Kate Olsen
Lepaskan: 2024-12-05 09:12:14
asal
975 orang telah melayarinya

How Can Go Function Types Returning Structs Be Used for Interface Implementations?

Jenis Fungsi Go Memulangkan Struktur untuk Pelaksanaan Antara Muka

Pertimbangkan senario di mana anda mempunyai struktur dalam pakej dengan kaedah dan kilang yang memakan masa fungsi. Untuk menguji struct ini dengan berkesan, adalah wajar untuk menggunakan kedua-dua fungsi kilang palsu dan struct palsu sebaik sahaja dibuat.

Kod berikut menunjukkan ini:

package expensive

import "fmt"

type myStruct struct{}

func (m *myStruct) DoSomething() {
    fmt.Println("In Do something")
}

func (m *myStruct) DoSomethingElse() {
    fmt.Println("In Do something else")
}

// CreateInstance is expensive to call
func CreateInstance() *myStruct {
    return &myStruct{}
}
Salin selepas log masuk

Dalam pakej bergantung, kami antara muka seperti ini:

package main

import "play/expensive"

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

type myInterface interface {
    DoSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}

func (s *structToConstruct) performAction() {
    instance := s.factoryFunction()
    instance.DoSomething()
}
Salin selepas log masuk

Walau bagaimanapun, kod ini menimbulkan ralat:

.\main.go:6: cannot use expensive.CreateInstance (type func() *expensive.myStruct) as type func() myInterface in field value
Salin selepas log masuk

Walaupun *mahal.myStruct melaksanakan myInterface, Go mengadu tentang keselamatan jenis.

Menurut pasukan Go, tingkah laku ini adalah disengajakan:

Having a function type in a struct field that returns the underlying concrete type would violate a core principle of interfaces. That principle is that the concrete type can be replaced by any other implementation of the interface type. If the receiver type of a function were the underlying concrete type, the behavior of the function would change if called via an interface.
Salin selepas log masuk

Penyelesaian adalah dengan membalut fungsi kilang:

wrapper := func() myInterface {
    return expensive.CreateInstance()
}
thing := structToConstruct{wrapper}
Salin selepas log masuk

Pembungkus ini mematuhi myInterface dan kod disusun.

Atas ialah kandungan terperinci Bagaimanakah Struktur Pemulangan Jenis Fungsi Go Boleh Digunakan untuk Pelaksanaan 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan