关于 Go 语法的困惑

  • 本文关键字:语法 Go 关于 go
  • 更新时间 :
  • 英文 :


我在 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 个值给 tcok.

这让我感到困惑。有人可以解释一下这段代码在做什么吗?

源代码在这里 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 的零值。

如果接口类型为 Connc 包含 *TCPConn 类型的值,则 ok 为 true,并且tc设置为存储在 c 中的类型*TCPConn的值。 c也可以包含nil*UDPConn*UnixConn等。在这种情况下,tc将是nilok将是假的。

if tc, ok := c.(*TCPConn); ok {
    tc.SetKeepAlive(true)
    tc.SetKeepAlivePeriod(d.KeepAlive)
    testHookSetKeepAlive()
}

最新更新