Golang Go语言中 OOP 好难啊

Golang Go语言中 OOP 好难啊

有几个数据库模型( Novel,Archives ),都是要增删改查的。用的是 Echo 框架。 本来想打算每个模型都对应一个请求模型,再 bind 到不同的 API。 即:

type NovelRequestGet struct{}
type NovelRequestDelete struct{}
...
type ArchiveRequestGet struct{}
type NovelRequestDelete struct{}
.....
echo.bind(&NovelRequest)
bind......

然后数据库操作一波,返回。

但是实际写的时候转念一想这不就是 CVM 嘛,除了传入变量类型不同其他代码完全一致。于是就用了 Interface。

type GetInterface interface {
	Get()*serializer.Response  //数据库查询操作
	Response() *serializer.Response //返回数据
}
func Get(service _interface.GetInterface)echo.HandlerFunc {
	return func(c echo.Context) (err error){
		if err := c.Bind(&service); err == nil {
			if err := service.Get(); err != nil {
				return c.JSON(200, err)
			} else {
				res := service.Response()
				return c.JSON(200, res)
			}
		} else {
			return c.JSON(200, &serializer.Response{
				Status: 40001,
				Msg:    "参数错误",
				Error:  fmt.Sprint(err),
			})
		}
	}
}

最后绑定路由

var ArchiveGet archive.GetService  
route.GET("/archive/:id", api.Get(&ArchiveGet))

这样本以为就可以实现泛型了,只要增删改查的业务就可以直接丢进来了。

然而,理想很美好,显示很骨干。

实际上运行

{
    "status": 40001,
    "data": null,
    "msg": "参数错误",
    "error": "code=400, message=binding element must be a struct"
}

还必须要转成 struct。。。

现在问题来了,请问各位老哥们:

  1. 我这样设计有错吗
  2. 如何解决目前这个问题

目前感觉唯一的解法似乎就是自己整一个反射然后再 Bind,但是感觉在这样弄一个 Interface{}的意义似乎就没有了?

请各位大佬解惑,小弟在此谢谢大家了


更多关于Golang Go语言中 OOP 好难啊的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

云程序员来了!
首先我没用过 echo (略

golang 的 struct 不是 class,不要试图带入基于 class 的 oop 的范式

一般而言,要复用用组合,要多态用 interface,要封装分 package 用 unexported type/field 完事儿

//要泛型等 go2

更多关于Golang Go语言中 OOP 好难啊的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你看,我就比较简单了,我就只会用

type NovelRequest struct{}
type ArchiveRequest struct{}

我也没用过 echo,不过我猜你应该这么设计:

根据/archive/:id中 id 绑定的具体参数,利用工厂模式生成不同的 struct。然后这些 struct 都实现了 interface,转换一下就行了,后面代码是一样的。

其实主要是工厂模式返回的 Struct 依旧是用 interface 返回出来的,而返回是 interface 的话,那个 bind 函数就用不了了

其实 xxxRequests 是必要有的,只是我想能不能省略一下 Bind。。毕竟每次 Bind 完的操作都是执行一样的函数,我就在想能不能只写一个 Bind,,,

感谢诸位解惑。解决了。其实是我的锅。。把 Bind 中的&去掉就行了,我丢人了丢人了,快 TMD 溜。。。

grpc 了解下

您好!理解您在学习Go语言(Golang)中面向对象编程(OOP)概念时遇到的困难。Go语言的设计哲学确实与许多传统OOP语言(如Java、C++)有所不同,这可能会导致初学者感到困惑。

首先,需要明确的是,Go并不是一种纯粹的面向对象编程语言。它更倾向于一种混合型的编程范式,结合了过程式编程和面向对象编程的某些特性,但更加简洁和直接。

在Go中,虽然没有传统的类和继承机制,但可以通过结构体(struct)和方法(method)来实现类似OOP的功能。结构体可以看作是一种自定义的数据类型,而方法则是与特定结构体类型相关联的函数。

此外,Go语言还通过接口(interface)来提供多态性,这是OOP中的一个重要概念。接口定义了一组方法签名,而不关心具体实现,这使得不同类型的结构体只要实现了接口中定义的方法,就可以被视为该接口类型的实例。

对于初学者来说,建议从Go的基础语法和数据类型开始学起,逐步过渡到结构体、方法和接口的使用。通过编写一些简单的程序来加深理解,并参考官方文档和社区资源来解答疑惑。

最后,请记住,学习任何一门新的编程语言都需要时间和实践。保持耐心,持续练习,您会逐渐掌握Go语言中的OOP概念,并能够编写出高效、简洁的代码。

回到顶部