修改一些语句 by 四月份平民

This commit is contained in:
astaxie
2012-09-11 09:29:21 +08:00
parent c1e7ec8b72
commit 587abe3ef0

10
5.1.md
View File

@@ -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里面。