关于 Go 语法的困惑

我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。


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


万千封印
浏览 236回答 1
1回答

哆啦的时光机

对于接口类型的表达式 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()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go