Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Melaksanakan kaedah antara muka menggunakan struktur jenis generik dalam Go

Melaksanakan kaedah antara muka menggunakan struktur jenis generik dalam Go

WBOY
WBOYke hadapan
2024-02-06 08:20:04428semak imbas

在 Go 中使用泛型类型结构实现接口方法

Kandungan soalan

Saya mahukan antara muka yang boleh menghantar parameter apa-apa jenis kepada kaedah tunggalnya dan saya mahukan struktur pelaksanaan tunggal dengan generik.

Ini adalah versi masalah saya yang sangat mudah:

package main

type MyInterface interface {
    Set(val any)
}

type MyStruct[T any] struct {
    val T
}

func NewMyStruct[T any]() *MyStruct[T] {
    return &MyStruct[T]{}
}

func (s *MyStruct[T]) Set(val T) {
    s.val = val
}

func main() {
    var obj MyInterface
    obj = NewMyStruct[any]() // accepted
    obj = NewMyStruct[int]() // not accepted
    obj = NewMyStruct[string]() // not accepted
}

Adakah terdapat cara untuk memenuhi keperluan pengkompil tanpa kehilangan maklumat jenis kaedah Set apabila berurusan dengan struct secara langsung?


Jawapan Betul


Kod

Saya rasa kod anda boleh diubah suai seperti ini

package main

import "fmt"

type MyInterface[T any] interface {
    Set(value T)
}

type MyStruct[T any] struct {
    val T
}

func NewMyStruct[T any]() *MyStruct[T] {
    return &MyStruct[T]{}
}

func (s *MyStruct[T]) Set(val T) {
    s.val = val
}

func main() {
    var obj1 MyInterface[int]
    obj1 = NewMyStruct[int]()

    var obj2 MyInterface[string]
    obj2 = NewMyStruct[string]()

    var obj3 MyInterface[any]
    obj3 = NewMyStruct[any]()
}

Arahan

Setiap kali anda menggunakan jenis parameter, anda mesti menggantikan parameter jenis dalam definisinya dengan jenis sebenar. Ini bermakna jenis generik dalam antara muka mesti dibuat instantiated. Untuk ini, antara muka anda harus diisytiharkan seperti ini.

// As-is
type MyInterface interface {
    Set(val any)
}
// To-be
type MyInterface[T any] interface {
    Set(val T)
}

Dan apabila menggunakannya, anda harus jelas tentang jenis any yang anda gunakan.

func main() {
    var obj1 MyInterface[int]
    obj1 = NewMyStruct[int]()
}

Saya petik dua muka surat

[1] Go error: Tidak boleh menggunakan jenis generik bukan instan

[2] Bagaimana untuk melaksanakan antara muka universal?

Atas ialah kandungan terperinci Melaksanakan kaedah antara muka menggunakan struktur jenis generik dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam