Golang 中国

源码位置:

https://github.com/goinaction/code/blob/master/chapter7/patterns/pool/main/main.go:90

log.Printf("Query: QID[%d] CID[%d]\n", query, conn.(*dbConnection).ID)

这里的 conn 不应该就是 *dbConnection 类型的吗?为啥还要 conn.(*dbConnection) ? 这是要做强制类型转换吗?哪里有相关的知识可以看?谢谢。

7 回复
fising
#1 fising • 2017-11-24 10:58

conn.(*dbConnection) 应该是属于类型断言(type assertion)

fising
#2 fising • 2017-11-24 11:01
hejiajie1989
#3 hejiajie1989 • 2017-11-29 08:12

不是类型断言吧

你看pool里面的Acquire方法是从pool拿到缓存的对象,返回类型是io.Closer,即只要实现了Closer的对象都可以。dbConnection需要做一次类型转换的

fising
#4 fising • 2017-11-29 09:08

@jimmykuu 帮忙看看啊,看了 3 楼的回复我又糊涂了。

jimmykuu
#5 jimmykuu • 2017-11-29 15:32

io.Closer 是接口类型,接口只定义方法,不能直接拿到字段,要转换成 struct 实例才能拿到 ID 字段。

hejiajie1989
#6 hejiajie1989 • 2017-11-30 10:54

嗯 是的 interface里面是有iTable和ptr的,通过conn.(*dbConnection) 可以拿到真实的struct结构的实例

fising
#7 fising • 2017-11-30 15:18

@jimmykuu @hejiajie1989 这里应该属于类型断言。

返回的是接口类型,需要具体的 struct 才能调用自己的方法。

类型转换的语法:<目标类型> ( <表达式> )
类型断言的语法:<表达式>.( 目标类型 )

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。