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 时。
- 1 回答
- 0 关注
- 57 浏览
添加回答
举报
0/150
提交
取消