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

Melaksanakan kaedah antara muka menggunakan struktur jenis generik dalam Go

WBOY
Lepaskan: 2024-02-06 08:20:04
ke hadapan
500 orang telah melayarinya

在 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
}
Salin selepas log masuk

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]()
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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

func main() {
    var obj1 MyInterface[int]
    obj1 = NewMyStruct[int]()
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan