登录
首页 >  Golang >  Go问答

在golang中,如何避免循环错误并传递func参数

来源:stackoverflow

时间:2024-02-21 21:57:24 145浏览 收藏

本篇文章给大家分享《在golang中,如何避免循环错误并传递func参数》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

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

我的主要功能是

project.com/exec

package main
import (
    appnames "project.com/exec/namemodel"
    appkafka "project.com/exec/kafka"
)
func main(){
    namesmap := make(map[string]*appnames.name)
    nameobj := appnames.name{}
    nameobj.fullname = "alexander lebowsky"
    nameobj.recieve()
    namesmap["alexander lebowsky"] = &nameobj
    appkafka.listenchars(nameobj)
    nameobj.sendname()
}

名称模型

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
    }
}

在kafka包中

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 中创建方法,该方法可以通过参数接收,但我需要通过通道接收。尽管如此,它并不能避免循环问题。预先感谢您。


解决方案


你的kafka和namemodel包是紧密耦合的。您应该考虑将两者合并。如果有一些对我们来说不明显的原因阻止您合并它们,您可以将 send 功能公开到 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中,如何避免循环错误并传递func参数》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>