Rumah > pembangunan bahagian belakang > Golang > Laksanakan antara muka pangkalan data/sql.Scanner

Laksanakan antara muka pangkalan data/sql.Scanner

王林
Lepaskan: 2024-02-10 13:30:08
ke hadapan
627 orang telah melayarinya

Laksanakan antara muka pangkalan data/sql.Scanner

editor php Yuzai akan memperkenalkan kepada anda cara melaksanakan antara muka pangkalan data/sql.Scanner dalam artikel ini. Dalam bahasa Go, pakej pangkalan data/sql ialah pakej teras untuk mengendalikan pangkalan data hubungan. Antara muka Pengimbas digunakan untuk mengimbas nilai dalam hasil pertanyaan pangkalan data ke dalam pembolehubah bahasa Go. Dengan melaksanakan antara muka Pengimbas, kami boleh menyesuaikan penukaran nilai dalam hasil pertanyaan pangkalan data ke dalam jenis yang kami mahu. Artikel ini akan menerangkan secara terperinci cara melaksanakan antara muka Pengimbas untuk membantu pembaca lebih memahami dan menggunakan operasi pangkalan data dalam bahasa Go.

Kandungan soalan

Bagaimana untuk melaksanakan database/sql.Scannerantara muka?

Dalam pertanyaan ini, terdapat 3 medan dalam klausa PILIH:

  • idkecil tak bertanda
  • is_suspended tinyint unsigned
  • name varchar

Dalam database/sql, jenis data 3 lajur ialah:

  • int64
  • int64
  • []uint8

Ini berfungsi untuk []antara muka{}, tetapi ingin melaksanakan setiap jenis lajur terus ke dalam antara muka []接口{},但希望将每个列类型直接实现到 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)
}
Salin selepas log masuk

Perkara yang saya cuba lakukan tetapi tidak benar-benar berjaya

Taip

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
}
Salin selepas log masuk

Kod

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)
}
Salin selepas log masuk

Penyelesaian

Mulakan ptr dengan penunjuk kepada nilai jenis yang diberikan.

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)
}
Salin selepas log masuk

ptr Slice tidak memberikan sebarang nilai dalam coretan di atas. Kod boleh dipermudahkan kepada:

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)
}
Salin selepas log masuk

Atas ialah kandungan terperinci Laksanakan antara muka pangkalan data/sql.Scanner. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan