关于Go语法的困惑

时间:2015-04-13 01:09:30

标签: 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)在这种情况下究竟做了什么?我认为最初它是某种类型的类型转换,但它返回tcok的2个值。

这让我感到困惑。有人可以解释这段代码的用途吗?

source code here第171行。

1 个答案:

答案 0 :(得分:7)

  

The Go Programming Language Specification

     

Type assertions

     

对于接口类型的表达式x和类型T,表示主要的   表达

     

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的零值。

如果类型为c的{​​{1}}(接口类型)包含Conn类型的值,则*TCPConn为真,ok设置为该值存储在tc中的*TCPConn类型。 c还可以包含cnil*UDPConn等。在这种情况下,*UnixConn将为tc,而nil将为false。

ok