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

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 吗?


烙印99
浏览 84回答 1
1回答

扬帆大鱼

所以基本上这里发生的是一个variable shadowing.Go 具有变量范围,您可以通过在函数外部定义变量来在全局范围内拥有一个变量。然后你就可以在同一个包中的任何地方使用这个变量(或者如果它被导出到你的代码中的任何地方)。然后你有在代码块中定义的变量。类似于var conn *kafka.Conn您可以从定义该变量的块(以及所有子块)中的任何地方访问该变量。将块视为用大括号括起来的代码{} 这意味着块if/else下是单独的块func。=现在你需要了解的是和之间的区别:==用于为变量赋值,而:=是用于声明和赋值变量的简写形式。因此,通过使用conn, err := d.Dial("tcp", kafkabroker)代码,您实际上要做的是在if块中声明新变量,并根据 func cal 的返回值将值分配给它们d.Dial。在某些情况下,您可能想要这样做。最常见的情况是当您有一个 for 循环启动使用来自外部块的变量的 goroutines 时。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go