Dictionary 如何避免golang中的循环错误。我只需要函数中的参数

Dictionary 如何避免golang中的循环错误。我只需要函数中的参数,dictionary,go,struct,Dictionary,Go,Struct,我在stackoverflow中看到相关问题,他们建议使用该接口。但我不知道如何将它集成到我的代码中 我的主要职能是 project.com/exec 名义模型 package namemodel import( appKafka "project.com/exec/kafka" ) type Name struct { FullName string Characteristics string NameChannel

我在stackoverflow中看到相关问题,他们建议使用该接口。但我不知道如何将它集成到我的代码中

我的主要职能是

project.com/exec

名义模型

package namemodel
import(
    appKafka "project.com/exec/kafka"
)
type Name struct {
    FullName          string
    Characteristics   string
    NameChannel       chan string
}
func (nameobj *Name) SendName(){
    appKafka.Send(nameobj.Name)
}
func (nameobj *Name) Recieve(){
    for{
         nameobj.Characteristics = <- NameChannel
    }
}
卡夫卡包装

package kafka
import(
    "github.com/segmentio/kafka-go"
    appNames "project.com/exec/namemodel"
)
func Send(name string){
    conn, err := kafka.DialLeader(context.Background(), "tcp", "localhost:8888", "test", 0)
    _, err = conn.WriteMessages(
        kafka.Message{Value: []byte(name)},
    )
}
func ListenChars(namesMap map[string]*appNames.Name){
    conf := kafka.ReaderConfig{Brokers: []string{"localhost:8888"}, Topic: "test1",}
    reader := kafka.NewReader(conf)
    for {
         m, err := reader.ReadMessage(context.Background())
         var model JsonModel
         err = json.Unmarshal(m.Value, &model)
         name := model["Name"]
         if nameObj, ok := namesMap[name]; ok {
             nameObj.NameChannel <- model["chars"]
         }
    }
}

请不要关心错误验证。我是在我的实际代码中做的,这是示例代码。请帮助说明不允许的导入周期。如何改进我的代码?我知道我可以在exec/namemodel中创建方法,该方法可以通过参数接收,但我需要通过通道接收。然而,它不能避免循环的问题。提前感谢。

您知道卡夫卡和namemodel软件包是紧密耦合的。你应该考虑合并这两个。如果有不明显的原因阻止您合并它们,您可以向namemodel软件包公开发送功能:

package namemodel

var Sender func(string) error

func (nameobj *Name) SendName(){
    Sender(nameobj.Name)
}
然后,在main或kafka包中的init函数中,在namemodel包中设置Sender函数

package main

func main() {
   ...
   namemodel.Sender=kafka.Send
   ...
}

这很有趣。但是看起来很不寻常。。。还有更优雅的方式吗?因为导入其他模块函数并将其发送给另一个模块,对我来说似乎很不寻常。还是golang的情况通常?我是新手,所以请理解我,please@NurislomRakhmatullaev,替代和首选的解决方案也在答案中:将相互依赖的两个包合并为一个包。@NurislomRakhmatullaev,这并不罕见。函数变量与Go中的其他变量没有什么不同。您也可以使用接口,但使用单个函数通常更容易。如果您没有任何其他理由将这两个包分开,请将它们合并,或者不要在您的模型中包含诸如发送之类的功能。不要制作微小的包。其实就是这么简单。
package main

func main() {
   ...
   namemodel.Sender=kafka.Send
   ...
}