Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengendalikan Antara Muka Pelaksana Struktur Pemulangan Fungsi Go?

Bagaimanakah Saya Boleh Mengendalikan Antara Muka Pelaksana Struktur Pemulangan Fungsi Go?

Barbara Streisand
Barbara Streisandasal
2024-12-08 04:18:09518semak imbas

How Can I Handle Go Functions Returning Structs Implementing Interfaces?

Jenis Fungsi Go yang Mengembalikan Struktur Dalam Antara Muka

Dalam Go, adalah perkara biasa untuk menggunakan antara muka untuk mentakrifkan gelagat struct. Walau bagaimanapun, apabila bekerja dengan fungsi yang mengembalikan struktur yang melaksanakan antara muka, anda mungkin menghadapi ralat keselamatan jenis.

Memahami Isu

Mari kita periksa contoh kod yang anda berikan:

package expensive

type myStruct struct { ... } // Struct with time-consuming methods
func CreateInstance() *myStruct { ... } // Expensive factory function
package main

import "expensive"

type myInterface interface { DoSomething() }
type structToConstruct struct { factoryFunction func() myInterface }
func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }

Di sini, anda menentukan fungsi kilang CreateInstance yang mengembalikan *myStruct. Anda kemudian mencipta antara muka myInterface yang *myStruct laksanakan. Walau bagaimanapun, anda memperuntukkan fungsi kilang kepada medan dalam structToConstruct yang menjangkakan fungsi mengembalikan myInterface, menyebabkan ralat penyusunan.

Menyelesaikan Isu

Untuk menyelesaikannya, anda mempunyai dua pilihan:

  1. Pembungkus Fungsi: Anda boleh membungkus fungsi kilang anda dalam pakej utama. Contohnya:
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
  1. Fungsi Kilang yang disemak: Sebagai alternatif, anda boleh mengubah suai CreateInstance untuk mengembalikan myInterface secara terus:
func CreateInstance() myInterface { return &myStruct{} }

Mengapa Pilihan 1 Berfungsi

Dalam Pilihan 1, fungsi pembungkus menukar hasil CreateInstance kepada myInterface sebelum memberikannya kepada factoryFunction. Ini memenuhi tandatangan jenis structToConstruct kerana fungsi pembalut sepadan dengan jenis fungsi yang dijangkakan.

Mengapa Pilihan 2 Memerlukan Cadangan 12754

Dalam Pilihan 2, jika anda cuba terus tetapkan CreateInstance kepada factoryFunction, Go akan mengadu kerana CreateInstance mengembalikan penunjuk berstruktur, bukan antara muka. Cadangan 12754 mencadangkan untuk melanjutkan bahasa untuk menyokong tugasan sedemikian, tetapi akhirnya ditolak.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Antara Muka Pelaksana Struktur Pemulangan Fungsi Go?. 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