2015-04-13 180 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() 
}