解决go中package依赖的一种思路--函数指针

解决 "import circle " 错误的主要思路:

将循环import的部分的依赖于实现(struct)改为依赖于抽象(interface)

这里提供一种基于 handler(即函数指针)的思路

下面的例子的总体package依赖关系:

main -----> auth  , core 
auth ---> sdk
core---> sdk

auth/ante.go

package auth

import (
	"fmt"
	"youngqqcn/sdk"
)

// 这里之所以用 dataFunc sdk.GetDataFunc 而不直接使用 core中的GetData函数
// 或者将GetData在此Dowork函数中实现, 是为了:
//  1.解决 core/msgs_test.go  "import circle"问题
//  2.根据设计原则, 降低模块间的耦合度, 不应该直接依赖实现, 而是依赖抽象(interface)
func Dowork( msg sdk.Msg, dataFunc sdk.GetDataFunc )  {
	msg.DoSomething1()
	data, err := dataFunc(msg)
	if err != nil {
		fmt.Printf("error: %v\n", err)
	} else {
		fmt.Println("ok==================%v", len(data))
	}
	fmt.Println("Do work")
}

core/msgs.go

package core

import (
	"fmt"
	"youngqqcn/sdk"
)

type MsgSend struct {
	Data []byte
}

func NewMsgSend(data []byte) MsgSend  {
	return MsgSend{
		Data: data,
	}
}

func (msg MsgSend)DoSomething1()  {
	fmt.Println("hello1")
}

func (msg MsgSend)DoSomething2()  {
	fmt.Println("hello2")
}

func GetData(msg sdk.Msg) ([]byte, error) {
	if sendMsg, ok := msg.(MsgSend) ; ok{
		return sendMsg.Data, nil
	}
	return []byte{}, nil
}

core/msgs_test.go

package core

import (
	"testing"
	"youngqqcn/auth"
)

func TestMsgSend_DoSomething1(t *testing.T) {

	msg := NewMsgSend([]byte{})
	auth.Dowork(msg, GetData)

}

sdk/tx_msg.go

package sdk

type Msg interface {

	DoSomething1()

	DoSomething2()

}

type GetDataFunc func(msg Msg)  ([]byte, error)

main.go

package main

import (
	"fmt"
	"youngqqcn/auth"
	"youngqqcn/core"package main
)

func main() {
	msg := core.NewMsgSend([]byte{0xff,0x55})
	auth.Dowork(msg, core.GetData)
	fmt.Println("this is main function")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值