gpt4 book ai didi

go - 如何使用 channel 在 go 例程之间传递 byte slice

转载 作者:行者123 更新时间:2023-12-01 22:26:37 25 4
gpt4 key购买 nike

我有一个从 source 读取数据的函数并将它们发送至destination .源和目标可以是任何东西,假设这个例子的源是数据库(任何 MySQLPostgreSQL ...),目标是 distributed Q (任何... ActiveMQKafka)。消息以字节存储。

这是主要功能。想法是它将旋转一个新的 go 例程并等待返回消息以供将来处理。

type Message []byte

func (p *ProcessorService) Continue(dictId int) {
level.Info(p.logger).Log("process", "message", "dictId", dictId)
retrieved := make(chan Message)

go func() {
err := p.src.Read(retrieved, strconv.Itoa(p.dictId))
if err != nil {
level.Error(p.logger).Log("process", "read", "message", "err", err)
}
}()

for r := range retrieved {
go func(message Message) {
level.Info(p.logger).Log("message", message)
if len(message) > 0 {
if err := p.dst.sendToQ(message); err != nil {
level.Error(p.logger).Log("failed", "during", "persist", "err", err)
}
} else {
level.Error(p.logger).Log("failed")
}
}(r)
}
}

这是读取功能本身
func (s *Storage) Read(out chan<- Message, opt ...string) error {

// I just skip some basic database read operations here
// but idea is simple, read data from the table / file row by row and
//
for _, value := range dataFromDB {
message, err := value.row
if err == nil {
out <- message
} else {
errorf("Unable to get data %v", err)
out <- make([]byte, 0)
}
}
})

close(out)

if err != nil {
return err
}

return nil
}

如您所见,通信是通过 out chan<- 消息 channel 完成的。
我对继续功能的关注,特别是这里
for r := range retrieved { 
go func(message Message) {
// basically here message and r are pointing to the same underlying array
}
}

收到数据时 var r是一种 slice 字节。然后它传递给 go func(message Message) go 中的所有内容都按值传递,在本例中为 var r将作为副本传递给匿名函数,但是它仍然有一个指向底层 slice 数据的指针。我很好奇 p.dst.sendToQ(message); 期间是否会出现问题执行并同时读取功能将发送一些东西到 out channel导致 slice 数据结构被新信息覆盖。我应该复制字节 slice r在传递给匿名函数之前进入新的 byte slice ,所以底层数组会有所不同吗?我对其进行了测试,但并不能真正导致这种行为。不确定我是偏执狂还是不得不担心。

最佳答案

messagep.dst.sendToQ(message)是与 value.row 相同的 slice 当你从数据库中获取数据时。所以,只要每个 value.row有不同的底层数组,你应该很好。因此,我建议您检查源代码并确保它不使用公共(public)字节数组并不断对其进行重写。

关于go - 如何使用 channel 在 go 例程之间传递 byte slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59617210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com