php小編魚仔在這篇文章中將向大家介紹如何實作database/sql.Scanner介面。在Go語言中,database/sql包是用於操作關係型資料庫的核心包。 Scanner介面用於將資料庫查詢結果中的值掃描到Go語言的變數中。透過實作Scanner接口,我們可以自訂將資料庫查詢結果中的值轉換為我們想要的類型。本文將詳細說明如何實現Scanner接口,幫助讀者更能理解並應用Go語言中的資料庫操作。
如何實作database/sql.Scanner
介面?
在此查詢中,SELECT 子句中有 3 個欄位:
id
smallint 無符號is_suspended
tinyint 無符號name
varchar
在
database/sql
int64
#int64
#[]uint8#這適用於
[]介面{},但希望將每個列類型直接實作到
database/sql.Scanner
cols := make([]interface{}, 3) ptr := make([]interface{}, 3) for i, _ := range cols { ptr[i] = &cols[i] } if err := rows.Scan(ptr...); err != nil { fmt.Println("err:", err) } // pair column data with column name res := map[string]any for i, name := range res_cols { res[name] = *ptr[i].(*any) fmt.Printf("Type: %T %s\n", res[name], name) }
類型
type Type_int int func (t *Type_int) Scan(value interface{}) error { switch value := value.(type) { case int64: *t = Type_int(value) default: return fmt.Errorf("Invalid database type: %T %v", value, value) } return nil } type Type_string string func (t *Type_string) Scan(value interface{}) error { switch value := value.(type) { case []uint8: *t = Type_string(value) default: return fmt.Errorf("Invalid database type: %T %v", value, value) } return nil }
ptr := make([]interface{}, 3) cols := []interface{}{ Type_int, Type_int, Type_string, } for i, _ := range cols { ptr[i] = &cols[i] } if err := rows.Scan(ptr...); err != nil { fmt.Println("err:", err) } // pair column data with column name res := map[string]any for i, name := range res_cols { res[name] = *ptr[i].(*any) fmt.Printf("Type: %T %s\n", res[name], name) }
使用指向給定類型值的指標初始化
ptr
var c1 Type_int var c2 Type_int var c3 Type_string ptr := []any{&c1, &c2, &c3} if err := rows.Scan(ptr...); err != nil { fmt.Println("err:", err) }
ptr 切片在上面的程式碼片段中沒有提供任何值。程式碼可以簡化為:###
var c1 Type_int var c2 Type_int var c3 Type_string if err := rows.Scan(&c1, &c2, &c3); err != nil { fmt.Println("err:", err) }
以上是實作database/sql.Scanner介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!