Go --- 解决Web项目中跨包结构体不能作为方法的接收者问题

跨包结构体不能作为方法的接收者,无论是直接接收或是指针传递都不行,所以当要使用dao-service-controller这个结构时,会出现在service层没办法使用dao层定义的结构体。
在这里插入图片描述

如何解决?

我们只需要将dao层定义的结构体复制到service层就行了,不过注意两个层的结构体虽然结构相同,但是并不相等还需要进行转化才可以进行数据传递,或者使用map[string]interference{}或者解码再编码。

这里只提供编码再解码的方法,因为这种方法比较方便,当编写好函数后只需要调用函数就能解决这个问题。

// Transfer
// s1,s2两个结构体结构相同
// 将s1的值传递给s2
func Transfer(s1, s2 interface{}) error {
	//logR, _ := GetLogger(Running)
	logE, _ := GetLogger(Errors)
	marshal, err := json.Marshal(s1)
	if err != nil {
		logE.Error("在解析中出错", err)
		//fmt.Println("marshal error:", err)
		return MarshalError
	}
	//fmt.Println(string(marshal))
	err = json.Unmarshal(marshal, s2)
	if err != nil {
		logE.Error("在反解析中出错", err)
		//fmt.Println("unmarshal error:", err)
		return MarshalError
	}
	return nil
}

不用在意日志代码,这并不会影响该函数功能的实现

//logR, _ := GetLogger(Running)
	logE, _ := GetLogger(Errors)

然后便可以再service层调用使用

func (s *Student) Get() error {
	if !s.IsExistById() {
		return util.UserNotExistError
	}
	student, err := models.QueryStudentById(s.ID)
	if err != nil {
		return err
	}
	err = util.Transfer(student, s)
	if err != nil {
		return err
	}
	return nil
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值