我是 Golang 的新手。我正在嘗試撰寫 Kafka Producer。pch我在頻道上收到訊息。一旦我得到它們,我想將它發送到 Kafka 主題。
此代碼必須發出。
- 在里面
select我收到警告,should use for range instead of for { select {} } (S1000)go-staticcheck - 選擇后我收到警告,
unreachable code
你能幫我理解如何避免和撰寫更好的代碼嗎?
func SendMsg(pch <-chan ProduceMsg) {
p, err := kafka.NewProducer(k.getConfigMap())
if err != nil {
log.Fatalf("Failed to create producer: %s\n", err)
}
log.Printf("Created Producer %v\n", p)
go func() {
for e := range p.Events() {
switch ev := e.(type) {
case *kafka.Message:
m := ev
if m.TopicPartition.Error != nil {
log.Printf("Delivery failed in producer: %v\n", m.TopicPartition.Error)
} else {
log.Printf("Delivered message in producer to topic %s [%d] at offset %v\n",
*m.TopicPartition.Topic, m.TopicPartition.Partition, m.TopicPartition.Offset)
}
case kafka.Error:
log.Printf("Error in reading producer event: %v\n", ev)
default:
log.Printf("Ignored producer event: %s\n", ev)
}
}
}()
var msgcnt int = 0
for {
select {
// Getting static check Error. How to avoid this?
case value := <-pch:
err = p.Produce(&kafka.Message{
TopicPartition: kafka.TopicPartition{Topic: k.topic, Partition: kafka.PartitionAny},
Value: []byte(value),
Headers: []kafka.Header{{Key: "myTestHeader", Value: []byte("header values are binary")}},
}, nil)
if err != nil {
if err.(kafka.Error).Code() == kafka.ErrQueueFull {
time.Sleep(time.Second)
continue
}
fmt.Printf("Failed to produce message: %v\n", err)
}
msgcnt
}
}
// This code is unreachable. How to avoid this?
for p.Flush(10000) > 0 {
fmt.Print("Still waiting to flush outstanding messages\n", err)
}
p.Close()
}
uj5u.com熱心網友回復:
代碼不可達錯誤是因為上面的for回圈沒有出路。這看起來像一個錯誤。
關于 for-select 的警告是您可以將 for-select 替換為:
for value:=range pch {
...
}
這將從 pch 讀取,直到 pch 關閉。這將消除無法訪問的代碼錯誤和警告。但是語意不同。在原始程式中,您根本沒有退出 for 回圈,因此您必須確定這是否真的是您需要做的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524297.html
標籤:去阿帕奇卡夫卡渠道协程
