go项目发送接口设计流程

Go发送接口设计的整体结构

678

service层实现

分为以下三个部分

  • 接口的定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    type (
    IDatasync interface {//定义一个interface(接口类型)的IDatasync
    Func1(ctx context.Context) (err error)//前面的括号是入参,后面的括号是出参
    Func2(ctx context.Context) (err error)
    Func3(ctx context.Context) (err error)
    }
    )
    //只定义抽象的接口名称,接口入参出参类型
    //数据实现层的接口的数量,名称,入参出参都要和这一致
  • 全局变量以及单例模式的定义实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var (
    localDatasync IDatasync//定义全局变量
    )

    func Datasync() IDatasync {//全局访问点,当系统其他地方需要调用接口方法是通过这个方法.Func1(ctx context.Context)
    if localDatasync == nil {
    panic("implement not found for interface IDatasync, forgot register?")
    }
    return localDatasync
    }
  • 注册具体方法实现

    1
    2
    3
    func RegisterDatasync(i IDatasync) {
    localDatasync = i
    }//将逻辑实现层中的方法具体实现注册进来

逻辑实现层的具体实现

接口实现的注册

1
2
3
4
5
6
7
8
9
10
11
12
type sDatasync struct{}
// sDatasyncNew 函数用于创建并返回一个 *sDatasync 类型的实例。
// 从代码中的 init 函数可以看出,该函数创建的实例会被传递给 service.RegisterDatasync 方法,
// 这表明 sDatasync 结构体实现了 service.IDatasync 接口,
// 此函数创建的实例会被注册到 service 模块中,供后续使用。
func sDatasyncNew() *sDatasync {
return &sDatasync{}
}
// 此方法是将 sDatasync 实例注册到 service 模块中
func init() {
service.RegisterDatasync(sDatasyncNew())
}

注意由于GO语言是包级作用域,因此如果接口过多,要分成多分文件去写,那么在同一包下的其他文件不用实现上面的注册,直接进行接口实现就行

接口的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 在 Go 语言里,`func` 后面的 `(s *sDatasync)` 被称作方法接收器(Method Receiver),
// 它表明这个函数是 `sDatasync` 结构体的一个方法。
// `*sDatasync` 表示使用指针接收器,意味着该方法可以修改 `sDatasync` 结构体实例的内容,
// 同时避免在调用方法时复制结构体实例,提高性能。
func (s *sDatasync) Func1(ctx context.Context) (err error) {
//获取所有用户信息
userInfoOut, err := proxy.GetUserAll(ctx)
if err != nil {
return
}
var userProfileInfos []*model.UserProfileInfo
for _, v := range userInfoOut {
//数据格式的转换
}
// 使用 json.Marshal 将 userProfiles 转换为 JSON 字符串
jsonData, err := json.Marshal(model.CustDataRequest{
CustDataVo: userProfileInfos,
})
if err != nil {
fmt.Println("Error converting to JSON:", err)
return
}
//对参数进行ASE进行加密
aesCrypto, err := utils.数据加密()
if err != nil {
g.Log().Errorf(context.Background(), "创建默认AES加解密工具失败: %v", err)
}
encryptedText, err := aesCrypto.Encrypt(string(jsonData))
outData, err := utils.发送数据(ctx, aesCrypto, consts.UploadUserList, encryptedText)
if err != nil {//这里传入的aesCrypto作为解密工具,负责将目标服务器发送的响应解密
return err
}
// 发送到目标地址,使用明文数据
// outData, err := utils.DoPost(ctx, nil, consts.UploadUserList, encryptedText)
// if err != nil {
// return err
// }
g.Log().Debugf(ctx, "返回结果:%v", outData)
return
}

代码中提到的utils包主要作用是实现一些非获取数据的其他功能,如加解密数据,数据发送等

目标服务器地址以及请求api的定义

通过const定义相关常量