2015-04-13 188 views
2

我在golang.org的net包源代码中看到了这个。关于Go语法的困惑

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

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

source code here线171

回答

6

The Go Programming Language Specification

Type assertions

当x接口类型和类型T的表达式,主 表达

x.(T)

断言x不是零,并且存储在x中的值是T类型。 符号x。(T)被称为类型断言。

在 特殊形式

v, ok = x.(T) 
v, ok := x.(T) 
var v, ok = x.(T) 

的分配或初始化中使用的类型的断言产生一个额外的无类型的布尔值。如果 声明成立,ok的值为true。否则,它是假的,v的值是T类型的 零值

如果Connc,接口类型,包含*TCPConn类型的值,那么ok是真实的,tc设置为存储在c中的*TCPConn类型的值。 c也可以包含nil,*UDPConn,*UnixConn等等。在这种情况下,tc将是nilok将是错误的。

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