跨包结构体不能作为方法的接收者,无论是直接接收或是指针传递都不行,所以当要使用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
}