我net在 golang.org 上的包源代码中看到了这一点。c, err := dial(network, ra.toAddr(), dialer, d.deadline())if d.KeepAlive > 0 && err == nil { if tc, ok := c.(*TCPConn); ok { tc.SetKeepAlive(true) tc.SetKeepAlivePeriod(d.KeepAlive) testHookSetKeepAlive() }}return c, err什么是c.(*TCPConn)正好做在这种情况下?我最初认为这是某种类型转换,但它返回 2 个值给tc和ok。这让我很困惑。有人可以解释一下这段代码在做什么吗?
1 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
对于接口类型的表达式 x 和类型 T,主要表达式
x.(T)
断言 x 不是 nil 并且存储在 x 中的值是 T 类型。符号 x.(T) 称为类型断言。
在特殊形式的赋值或初始化中使用的类型断言
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
产生一个额外的无类型布尔值。如果断言成立,则 ok 的值为真。否则它是假的并且 v 的值是类型 T 的零值。
如果c类型Conn,接口类型,包含类型的值*TCPConn则ok是真实的,tc被设定为所述类型的值*TCPConn存储在c。c还可以包含nil,*UDPConn,*UnixConn,等等。在这种情况下,tc会nil和ok将是错误的。
if tc, ok := c.(*TCPConn); ok {
tc.SetKeepAlive(true)
tc.SetKeepAlivePeriod(d.KeepAlive)
testHookSetKeepAlive()
}
- 1 回答
- 0 关注
- 235 浏览
添加回答
举报
0/150
提交
取消