我在 golang.org 的net
包源代码中看到了这一点。
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
.
这让我感到困惑。有人可以解释一下这段代码在做什么吗?
源代码在这里 171 行。
Go 编程语言规范
类型断言
对于接口类型和类型 T 的表达式 x,主 表达
x.(T)
断言 x 不是 nil,并且存储在 x 中的值是 T 类型。 表示法 x.(T) 称为类型断言。
在赋值或初始化中使用的类型断言 特殊形式
v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T)
生成一个额外的非类型化布尔值。如果 ok 的值为真,则为 true 这种说法成立。否则为假,v 的值为 类型 T 的零值。
如果接口类型为 Conn
的 c
包含 *TCPConn
类型的值,则 ok
为 true,并且tc
设置为存储在 c
中的类型*TCPConn
的值。 c
也可以包含nil
、*UDPConn
、*UnixConn
等。在这种情况下,tc
将是nil
,ok
将是假的。
if tc, ok := c.(*TCPConn); ok {
tc.SetKeepAlive(true)
tc.SetKeepAlivePeriod(d.KeepAlive)
testHookSetKeepAlive()
}