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 關注
- 69 瀏覽
添加回答
舉報
0/150
提交
取消