Rumah > pembangunan bahagian belakang > Golang > Antara muka dengan kekangan jenis untuk kaedah sebagai fungsi generik

Antara muka dengan kekangan jenis untuk kaedah sebagai fungsi generik

王林
Lepaskan: 2024-02-06 09:45:11
ke hadapan
1008 orang telah melayarinya

Antara muka dengan kekangan jenis untuk kaedah sebagai fungsi generik

Kandungan soalan

Saya cuba menggunakan generik semasa menulis fungsi penegasan untuk menguji sesuatu, tetapi ia memberi saya ralat some does not implement testutilt (wrong type for method equals...). Jika ya bagaimana saya boleh membuat kod di bawah berfungsi?

package test_util

import (
    "fmt"
    "testing"
)

type TestUtilT interface {
    Equals(TestUtilT) bool
    String() string
}

func Assert[U TestUtilT](t *testing.T, location string, must, is U) {
    if !is.Equals(must) {
        t.Fatalf("%s expected: %s got: %s\n",
            fmt.Sprintf("[%s]", location),
            must,
            is,
        )
    }
}

type Some struct {
}

func (s *Some) Equals(other Some) bool {
    return true
}

func (s *Some) String() string {
    return ""
}

func TestFunc(t *testing.T) {
    Assert[Some](t, "", Some{}, Some{}) 
    // Error: "Some does not implement TestUtilT (wrong type for method Equals...)"

}
Salin selepas log masuk


jawapan betul


pengganti

func (s *some) equals(other some) bool {
Salin selepas log masuk

dan

func (s *some) equals(other testutilt) bool {
Salin selepas log masuk

Kemudian gantikan

assert[some](t, "", some{}, some{})
Salin selepas log masuk

dan

Assert[Some](t, "", &Some{}, &Some{})
Salin selepas log masuk

Perubahan pertama akan membetulkan mesej ralat awal anda, tetapi tanpa perubahan kedua kod anda masih tidak akan berfungsi.

Atas ialah kandungan terperinci Antara muka dengan kekangan jenis untuk kaedah sebagai fungsi generik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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