Heim >Backend-Entwicklung >Golang >Konvertieren Sie den privaten dynamischen Typ von der Schnittstelle {}

Konvertieren Sie den privaten dynamischen Typ von der Schnittstelle {}

WBOY
WBOYnach vorne
2024-02-06 09:15:11990Durchsuche

Konvertieren Sie den privaten dynamischen Typ von der Schnittstelle {}

Frageninhalt

Ich versuche go-sqlmock 包测试 sql 查询,其中参数之一是 gosnowflake.array zu verwenden (im Wesentlichen eine Hülle um Scheiben). Normalerweise müsste ich für so etwas einen Wertekonverter erstellen, den ich eingefügt habe:

func (opt arrayConverterOption[T]) ConvertValue(v any) (driver.Value, error) {
    casted, ok := v.(*[]T)
    if ok {
        Expect(*casted).Should(HaveLen(len(opt.Expected)))
        for i, c := range *casted {
            Expect(c).Should(Equal(opt.Expected[i]))
        }
    } else {
        fmt.Printf("Type: %T\n", v)
        return v, nil
    }

    return "TEST_RESULT", nil
}

Jetzt wird diese Funktion für jeden an die Abfrage übermittelten Parameter aufgerufen. Ich verwende dies, um zu testen, ob die Werte in einem Slice korrekt sind, oder um Parameter zu übergeben, wenn nicht. Das Problem, das ich habe, ist, wenn ich arrayconverteroption[string] 并给它一个 gosnowflake.array(["a", "b", "c"]) 作为参数时,类型断言失败,因为gosnowflake.array 返回一个内部动态类型 *stringarray,它被定义为 *[]string erstelle.

Hier könnt ihr mein Dilemma sehen. Zum einen kann ich nicht konvertieren v 因为它是 interface{} 并且我无法为 v 起别名,因为内部类型不是 *[]string,而是 *stringarray. Also, was soll ich hier tun?


Richtige Antwort


Ich habe keinen Weg gefunden, dies zu tun, ohne zum Nachdenken anzuregen. Nach einiger Überlegung habe ich jedoch Folgendes getan:

var casted []T
var ok bool

value := reflect.ValueOf(v)
if value.Kind() == reflect.Pointer {
    if inner := value.Elem(); inner.Kind() == reflect.Slice {
        r := inner.Convert(reflect.TypeOf([]T{})).Interface()
        casted, ok = r.([]T)
    }
}

Dieser Code sucht also speziell nach Zeigern auf ein Slice, das mein dynamischer Typ ist. Anschließend wird das interne Objekt mithilfe von Reflektion in den von mir erwarteten Slice-Typ konvertiert. Danach rufe ich interface() 以从反射值中获取 interface{},然后将其转换为 []t wegen des Ergebnisses an. Das ist es. Wenn nicht, verwende ich keinen dieser dynamischen Typ-Slices und kann den Typ normal verarbeiten.

Das obige ist der detaillierte Inhalt vonKonvertieren Sie den privaten dynamischen Typ von der Schnittstelle {}. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen