Heim >Backend-Entwicklung >Golang >Konvertieren Sie den privaten dynamischen Typ von der Schnittstelle {}
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?
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!