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.
Bagaimana untuk melaksanakan database/sql.Scanner
antara muka?
Dalam pertanyaan ini, terdapat 3 medan dalam klausa PILIH:
id
kecil tak bertandais_suspended
tinyint unsignedname
varcharDalam 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) }
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 }
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) }
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) }
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) }
Atas ialah kandungan terperinci Laksanakan antara muka pangkalan data/sql.Scanner. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!