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

Antara muka dengan kekangan jenis untuk kaedah sebagai fungsi generik

王林
王林ke hadapan
2024-02-06 09:45:11938semak imbas

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...)"

}

jawapan betul


pengganti

func (s *some) equals(other some) bool {

dan

func (s *some) equals(other testutilt) bool {

Kemudian gantikan

assert[some](t, "", some{}, some{})

dan

Assert[Some](t, "", &Some{}, &Some{})

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!

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