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。。。
现在问题来了,请问各位老哥们:
- 我这样设计有错吗
- 如何解决目前这个问题
目前感觉唯一的解法似乎就是自己整一个反射然后再 Bind,但是感觉在这样弄一个 Interface{}的意义似乎就没有了?
请各位大佬解惑,小弟在此谢谢大家了
更多关于Golang Go语言中 OOP 好难啊的实战教程也可以访问 https://www.itying.com/category-94-b0.html
云程序员来了!
首先我没用过 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概念,并能够编写出高效、简洁的代码。