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

跨包结构体不能作为方法的接收者,无论是直接接收或是指针传递都不行,所以当要使用dao-service-controller这个结构时,会出现在service层没办法使用dao层定义的结构体。
Go --- 解决Web项目中跨包结构体不能作为方法的接收者问题_第1张图片

如何解决?

我们只需要将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
}

你可能感兴趣的:(go学习笔记,golang,前端,java)