登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-20 19:36:39 477浏览 收藏

哈喽!今天心血来潮给大家带来了《在golang中使用条件块外的变量》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习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, err := kafka.dial("tcp", kafkabroker)conn, err := d.dial( 中影响其值后,conn 仍为空“tcp”,kafkabroker) 我缺少什么?有什么方法可以将 conn var 从 if/else 块中取出而不清空其内容吗?


正确答案


所以基本上这里发生的是 变量阴影

Go 具有变量作用域,您可以通过在函数外部定义变量来在全局作用域中拥有变量。然后,您将能够在同一包中的任何位置使用此变量(或者如果它被导出到代码中的任何位置)。

然后您就拥有了在代码块中定义的变量。与 var conn *kafka.Conn 类似,您可以从定义它的块(以及所有子块)中的任何位置访问此变量。

将块视为大括号 {} 括起来的代码 这意味着 if/elsefunc 块下的单独块。

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

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

因此,通过使用 conn, err := d.Dial("tcp", kafkabroker) 代码,您实质上要做的就是在 if 块中声明新变量,并从 d.Dial 的返回值中将值分配给它们功能校准。

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

以上就是《在golang中使用条件块外的变量》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>