乐趣区

关于go:go源码阅读databasesqldriver接口-与mysql-实现-gosqldriver库

一、简介

database/sql 是一个给 sql-like 数据库应用的官网库,次要实现了

  1. driver (sql-like) 数据库的驱动接口
  2. sql 相干的办法

在地址 https://github.com/golang/go/wiki/SQLDrivers 有具体实现了 database/sql 的 sql-like 驱动库列表

在 go 源码 src/database/sql/sql.go
有一个注册 driver 办法:

func Register(name string, driver driver.Driver) {driversMu.Lock()
    defer driversMu.Unlock()
    if driver == nil {panic("sql: Register driver is nil")
    }
    if _, dup := drivers[name]; dup {panic("sql: Register called twice for driver" + name)
    }
    drivers[name] = driver
}

在每一个 driver 驱动实现,都会调用这个办法。
比方 mysql 驱动 go-sql-driver 的实现如下:
在源码 github.com/go-sql-driver/mysql/drver.go

func init() {sql.Register("mysql", &MySQLDriver{})
}

就把 go-sql-driver 驱动实现,注入到了 database/sql 中了。
而后咱们应用的时候,就能够这样用了:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "testing"
)

func TestOpen(t *testing.T) {db, err := sql.Open("mysql", "dns")
    t.Log(db, err)
}

在这里咱们援用了 _ “github.com/go-sql-driver/mysql”
但却应用 database/sql 外面的办法,因为 go-sql-driver 只是一个实现。
因为在 go-sql-driver 咱们注册了 “mysql” 的值,而后就能够在 database/sql 调用了。

退出移动版