die variadische Funktion scan () mit Reflexion
Die Funktion von rows.scan () bietet eine bequeme Möglichkeit, Daten aus einer Datenbank abzurufen Abfrage. Es wird jedoch eine variable Anzahl von Zeigern als Argumente verwendet, die eine Herausforderung sein können, die Verwendung von Reflexion zu integrieren. Betrachten Sie das folgende Szenario:
Sie möchten ein Stück mit Werten, die aus einer Abfrage erhalten wurden, dynamisch bevölkern und verwenden Zeilen.Scan (), um die Daten zu extrahieren. In diesem Fall müssen Sie die Anzahl der Spalten bestimmen und eine Slice erstellen, um die Werte zu speichern.
eine gemeinsame Fallstrick:
Ein Versuch, Reflection zu verwenden, um das anzurufen Die Funktion scan () kann zu unerwarteten Ergebnissen führen. Dies liegt daran ] Um Scan () mit Reflexion erfolgreich aufzurufen, wird ein Dual-Slice-Ansatz verwendet. Die erste Scheibe, Werte, enthält die tatsächlichen Daten, während das zweite Slice, ValuesPtrs, Zeiger auf jedes Element in Werten enthält.
Für jede Spalte im Abfrageergebnis wird ein Zeiger in ValueSPtrs dem entsprechenden Element zugeordnet in Werten. Anschließend kann Rows.scan () mit ValuerSPtrs als Argument aufgerufen werden, um Werte effektiv zu füllen. importieren ( "fmt" _ "github.com/lib/pq" "Datenbank/SQL" ) func main () { db, _: = sql.open ( "Postgres", "user = postgres dbname = go_testing password = pass sslMode = disable")) Zeilen, _: = db.query ("aus _user auswählen;") Spalten, _: = Zeilen.Columns () zählen: = len (Spalten) Werte: = make ([] Schnittstelle {}, zählen) valuessptrs: = make ([] interface {}, count) für rows.next () { für i: = Bereichsspalten { VALTURSPTRS [i] = & values [i] } rows.scan (valuessptrs ...) Für i, col: = Bereichsspalten { Val: = Werte [i] B, OK: = Val. ([] Byte) var v interface {} if (ok) { v = String (b) } anders { v = val } fmt.println (col, v) } } } In diesem Beispiel wird in diesem Beispiel rows.scan () mit den Zeiger -Slice ValuesPtrs aufgerufen, wodurch die Werte mit den abgerufenen Daten geschnitten werden. Die Schleife druckt dann jeden Spaltennamen und seinen entsprechenden Wert.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3