为了账号安全,请及时绑定邮箱和手机立即绑定

关于 Go 语法的困惑

关于 Go 语法的困惑

Go
万千封印 2021-09-27 20:55:00
我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什么是c.(*TCPConn)正好做在这种情况下?我最初认为这是某种类型转换,但它返回 2 个值给tc和ok。这让我很困惑。有人可以解释一下这段代码在做什么吗?
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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


x.(T)


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


在特殊形式的赋值或初始化中使用的类型断言


v, ok = x.(T)

v, ok := x.(T)

var v, ok = x.(T)

产生一个额外的无类型布尔值。如果断言成立,则 ok 的值为真。否则它是假的并且 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()

}


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信