Fungsi Mengejek di Golang
Di Golang, fungsi mengejek yang diisytiharkan pada jenis konkrit tidak disokong secara langsung. Walau bagaimanapun, terdapat beberapa strategi untuk mencapai kefungsian yang serupa.
Nilai Fungsi
Nilai fungsi, termasuk pembolehubah, medan struct atau parameter, boleh dipermainkan. Pertimbangkan perkara berikut:
var Fn = func() { ... } type S struct { Fn func() } func F(Fn func())
Fn dalam semua keadaan ini boleh dipermainkan.
Antaramuka
Antara muka mengejek ialah pilihan pilihan. Cipta antara muka yang mewakili kaedah fungsi sasaran anda:
type ProductRepository interface { GetProductById(DB *sql.DB, ID int) (p Product, err error) }
Laksanakan versi nyata dan tiruan antara muka ini:
// Real implementation type ProductStore struct{} func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) { // ... } // Mock implementation type ProductRepositoryMock struct {} func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) { // ... }
Kod yang bergantung pada ProductRepository kini boleh dihantar pelaksanaan sebenar untuk kegunaan pengeluaran dan pelaksanaan olok-olok untuk ujian.
Antaramuka Meniru
Sebagai alternatif, tentukan antara muka yang meniru kaedah *sql.DB, kemudian gunakan jenis antara muka itu sebagai jenis parameter untuk fungsi anda:
type DBIface interface { Query(query string, args ...interface{}) (*sql.Rows, error) // ... } type DBMock struct {} func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) { // ... } func GetProductByName(DB DBIface, name string) (p Product, err error) { // ... }
Ini menjadikan Parameter DB boleh diejek.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengejek Fungsi dengan Berkesan di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!