我在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)
在这种情况下究竟做了什么?我认为最初它是某种类型的类型转换,但它返回tc
和ok
的2个值。
这让我感到困惑。有人可以解释这段代码的用途吗?
source code here第171行。
答案 0 :(得分:7)
The Go Programming Language Specification
对于接口类型的表达式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
还可以包含c
,nil
,*UDPConn
等。在这种情况下,*UnixConn
将为tc
,而nil
将为false。
ok