我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
Run Code Online (Sandbox Code Playgroud)
c.(*TCPConn)在这种情况下究竟做了什么?我认为最初它是某种类型的类型转换,但它返回2 tc和值ok.
这对我来说很困惑.有人能解释一下这段代码在做什么吗?
源代码在这里第171行.
对于接口类型的表达式x和类型T,主表达式
x.(T)声明x不是nil并且存储在x中的值是T类型.符号x.(T)称为类型断言.
在特殊形式的赋值或初始化中使用的类型断言
Run Code Online (Sandbox Code Playgroud)v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T)产生一个额外的无类型布尔值.如果断言成立,则ok的值为true.否则为false,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()
}
Run Code Online (Sandbox Code Playgroud)