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

在golang中使用条件块之外的变量

在golang中使用条件块之外的变量

Go
烙印99 2023-02-21 12:46:53
func CheckKafkaReadPartitions(kafkabroker string, topic string, conf config.Config) bool {    var conn *kafka.Conn    if conf.TlsEnabled {        d := &kafka.Dialer{            TLS: &tls.Config{},        }        conn, err := d.Dial("tcp", kafkabroker)        log.Info("conn is: ", conn)        log.Info("Using TLS connection")        if err != nil {            log.WithError(err).Warn("Kafka broker connection error")            return false        }        defer conn.Close()    } else {        conn, err := kafka.Dial("tcp", kafkabroker)        log.Info("conn is: ", conn)        log.Info("Using Plaintext connection")        if err != nil {            log.WithError(err).Warn("Kafka broker connection error")            return false        }        defer conn.Close()    }    log.Info("conn is: ", conn)    log.Info("Reading Partitions")    partitions, err := conn.ReadPartitions() // SOME OTHER WORK}我注意到,在调用 ReadPartitions() 方法时,conn 是空的,即使在影响它的值之后conn, err := kafka.Dial("tcp", kafkabroker)或者conn, err := d.Dial("tcp", kafkabroker) 我错过了什么?有什么办法可以在不清空其内容的情况下从 if/else 块中取出 conn var 吗?
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

所以基本上这里发生的是一个variable shadowing.

Go 具有变量范围,您可以通过在函数外部定义变量来在全局范围内拥有一个变量。然后你就可以在同一个包中的任何地方使用这个变量(或者如果它被导出到你的代码中的任何地方)。

然后你有在代码块中定义的变量。类似于var conn *kafka.Conn您可以从定义该变量的块(以及所有子块)中的任何地方访问该变量。

将块视为用大括号括起来的代码{} 这意味着块if/else下是单独的块func

=现在你需要了解的是和之间的区别:=

=用于为变量赋值,而:=是用于声明和赋值变量的简写形式。

因此,通过使用conn, err := d.Dial("tcp", kafkabroker)代码,您实际上要做的是在if块中声明新变量,并根据 func cal 的返回值将值分配给它们d.Dial

在某些情况下,您可能想要这样做。最常见的情况是当您有一个 for 循环启动使用来自外部块的变量的 goroutines 时。


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号