我是靠谱客的博主 火星上心情,最近开发中收集的这篇文章主要介绍解决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: %vn", 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")
}

最后

以上就是火星上心情为你收集整理的解决go中package依赖的一种思路--函数指针的全部内容,希望文章能够帮你解决解决go中package依赖的一种思路--函数指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部