diff --git a/5.1.md b/5.1.md index 8e5dae32..69f8a5e3 100644 --- a/5.1.md +++ b/5.1.md @@ -1,8 +1,8 @@ #5.1 database/sql接口 -Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义了一些标准接口用来开发数据库驱动,第三方用户可以根据定义的接口来开发相应的数据库驱动,其实这样做有一个好处,我们按照标准接口开发的代码,将来迁移数据库是相当方便的,换一个数据库驱动,但是底层的接口没有任何变化。那么Go都定义了那些标准接口呢?让我们来详细的分析一下 +Go和PHP不同的地方是,他没有官方提供数据库驱动,而是为开发数据库驱动定义了一些标准接口,第三方用户可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,我们按照标准接口开发的代码, 在需要迁移数据库时,不需要任何修改。那么Go都定义了那些标准接口呢?让我们来详细的分析一下 ##sql.Register -这个函数是database/sql里面用来注册数据库驱动的,当第三方开发者开发完毕一个数据库驱动,都会在驱动里面有一个init函数,里面都会调用这个`Register(name string, driver driver.Driver)` +这个存在于database/sql的函数是用来注册数据库驱动的,当第三方开发者开发数据库驱动时,都会实现init函数,在init里面会调用这个`Register(name string, driver driver.Driver)`完成本驱动的注册。 我们来看一下mymysql、sqlite3的驱动里面都是怎么调用的: @@ -19,7 +19,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义 sql.Register("mymysql", &d) } -我们看到第三方驱动都是通过调用这个函数来注册自己的驱动名称以及相应的driver。database/sql内部是一个map类型用来存储相应的驱动。 +我们看到第三方驱动都是通过调用这个函数来注册自己的驱动名称以及相应的driver。在database/sql内部通过一个map来存储相应的驱动。 var drivers = make(map[string]driver.Driver) @@ -32,7 +32,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义 > "database/sql" > _ "github.com/mattn/go-sqlite3" > ->新手都会被这个`_`所迷惑,其实这个就是Go设计的巧妙之处,我们知道在变量赋值的时候看到过这个,是用来忽略变量的意思,那么这个包引入也是,这个只是引入包而不直接使用这个pkg的调用,我们在2.3流程和函数里面介绍过init函数的初始化过程,包在引入的时候会去初始化包内部的init函数,那么我们引入上面的数据库驱动包之后会去调用init函数,然后在init函数里面注册了这个数据库驱动,这样我们就可以在接下来的代码中直接使用这个数据库驱动了。 +>新手都会被这个`_`所迷惑,其实这个就是Go设计的巧妙之处,我们在变量赋值的时候经常看到这个,它是用来忽略变量的占位符,那么这个包引入也是,这儿的意思是引入此包而不直接使用这个包中定义的函数,变量等资源,我们在2.3流程和函数里面介绍过init函数的初始化过程,包在引入的时候会去调用包的init函数以完成对包的初始化,因此我们引入上面的数据库驱动包之后会去调用init函数,然后在init函数里面注册了这个数据库驱动,这样我们就可以在接下来的代码中直接使用这个数据库驱动了。 ##driver.Driver 数据库驱动是一个接口定义,他定义了一个method: Open(name string),这个方法返回一个数据库的Conn接口,这个Conn只能用来进行一次goroutine的操作。 @@ -41,7 +41,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义 Open(name string) (Conn, error) } -每个驱动的这个函数都是通过name参数用来解析,然后初始化一个Conn返回。 +每个驱动都会定义这个函数,它会解析name参数来获取相关数据库的连接信息,解析完成后,它将使用此信息来初始化一个Conn并返回它。 ##driver.Conn 数据库连接是一个接口定义,他定义了一系列方法,这个Conn只能应用在一个goroutine里面,不能使用在多个goroutine里面。