首頁 > 後端開發 > Golang > 主體

實作database/sql.Scanner介面

王林
發布: 2024-02-10 13:30:08
轉載
574 人瀏覽過

實作database/sql.Scanner介面

php小編魚仔在這篇文章中將向大家介紹如何實作database/sql.Scanner介面。在Go語言中,database/sql包是用於操作關係型資料庫的核心包。 Scanner介面用於將資料庫查詢結果中的值掃描到Go語言的變數中。透過實作Scanner接口,我們可以自訂將資料庫查詢結果中的值轉換為我們想要的類型。本文將詳細說明如何實現Scanner接口,幫助讀者更能理解並應用Go語言中的資料庫操作。

問題內容

如何實作database/sql.Scanner介面?

在此查詢中,SELECT 子句中有 3 個欄位:

  • idsmallint 無符號
  • is_suspended tinyint 無符號
  • name varchar

database/sql

中,3列的資料型別是:
  • 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中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!