Rumah > pembangunan bahagian belakang > Golang > Bolehkah Refleksi Go Mencipta Fungsi Melaksanakan Antara Muka Dipratentukan?

Bolehkah Refleksi Go Mencipta Fungsi Melaksanakan Antara Muka Dipratentukan?

Mary-Kate Olsen
Lepaskan: 2024-12-11 18:18:12
asal
966 orang telah melayarinya

Can Go's Reflection Create Functions Implementing Predefined Interfaces?

Memperluaskan Keupayaan Refleksi Go

Soalan:

Adakah mungkin untuk mencipta fungsi secara dinamik yang melaksanakan antara muka yang telah ditetapkan dalam Pergi guna refleksi?

Jawapan:

Dalam versi asal Go, tidak mungkin untuk mencipta jenis baharu dengan kaedah yang dilampirkan melalui refleksi. Walau bagaimanapun, dengan keluaran Go 1.5, fungsi reflect.FuncOf dan reflect.MakeFunc telah diperkenalkan untuk menangani keperluan yang tepat ini.

Fungsi ini membolehkan anda menentukan jenis fungsi dan mencipta nilai fungsi yang mematuhinya. type:

funcType := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{reflect.TypeOf("")})
fn := reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { ... })
Salin selepas log masuk

Argumen pertama untuk mencerminkan.MakeFunc ialah jenis fungsi, manakala argumen kedua ialah nilai fungsi yang melaksanakan jenis itu.

Dalam konteks contoh yang diberikan:

type MyService interface {
  Login(username, password string) (sessionId int, err error)
  HelloWorld(sessionId int) (hi string, err error)
}
Salin selepas log masuk

Anda boleh mencipta fungsi yang melaksanakan antara muka ini menggunakan pantulan seperti berikut:

fn := reflect.MakeFunc(reflect.TypeOf((*MyService)(nil)).Elem(), func(args []reflect.Value) []reflect.Value {
  switch args[0].String() {
  case "Login":
    return []reflect.Value{
      reflect.ValueOf(1),
      reflect.ValueOf(nil),
    }
  case "HelloWorld":
    return []reflect.Value{
      reflect.ValueOf("Hello, world!"),
      reflect.ValueOf(nil),
    }
  }
  return []reflect.Value{
    reflect.Value{},
    reflect.ValueOf(errors.New("Method not found")),
  }
})
Salin selepas log masuk

Pelaksanaan ini menggunakan pernyataan suis untuk menentukan kaedah antara muka yang hendak dipanggil berdasarkan hujah pertama. Ia kemudian mengembalikan nilai yang sesuai untuk argumen output.

Atas ialah kandungan terperinci Bolehkah Refleksi Go Mencipta Fungsi Melaksanakan Antara Muka Dipratentukan?. 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