golang iris mvc controller出现reflect异常

本文详细记录了在使用Golang Iris框架的MVC模式时遇到的反射异常,特别是在controller中出现的问题。作者指出,当struct定义包含私有成员变量或handler方法的入参未在BeforeActivation中注册时,可能会导致反射错误。解决此类问题的关键在于理解Iris MVC的工作原理和反射机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明

本文主要记录本人在使用iris框架mvc模块过程中犯过引起controller反射出错的错误,仅供参考。如有未收录的情况实属正常。

controller出现反射错误,只能在异常信息中看到异常类型,但异常栈中找不到具体出错的代码。调试起来相当困难,自己写的代码还好,要是别人拿代码来找你,别提多?疼了。因此记录下遇到的情况,要是遇到类似错误,按图索骥,排查问题。

前言

iris官网,在其GitHub仓库的_example文件夹能够找到示例,但没有使用文档。要熟悉框架,老老实实爬代码去吧(╯▔皿▔)╯

mvc pattern简介

~blablabla~

iris mvc 简介

~blablabla~

controller反射出错

controller与反射

非单例模式下,mvc模块会为每个请求实例化一个controller(有误欢迎指正)。这时就会从通过 mvc.New()</

很高兴回答这个问题。以下是一个基于Go语言Iris框架的MVC(模型-视图-控制器)架构的源代码实现: 1、router.go: ``` package router import ( "github.com/kataras/iris/v12" "myproject/controller" ) func Router(app *iris.Application) { userController := controller.UserController{} app.Handle("GET", "/users", userController.GetAll) app.Handle("GET", "/user/{id}", userController.GetByID) app.Handle("POST", "/user", userController.Create) app.Handle("PUT", "/user/{id}", userController.UpdateByID) app.Handle("DELETE", "/user/{id}", userController.DeleteByID) } ``` 2、model.go: ``` package model import ( "gorm.io/driver/mysql" "gorm.io/gorm" "myproject/config" ) var ( DB *gorm.DB ) func Init() { dsn := config.GetDSN() var err error DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } DB.AutoMigrate(&User{}) } type User struct { gorm.Model Name string `gorm:"type:varchar(32)"` Age int `gorm:"default:18"` } func (u *User) TableName() string { return "users" } ``` 3、service.go: ``` package service import ( "myproject/model" ) type UserService struct{} func (us *UserService) GetAll() []*model.User { var users []*model.User model.DB.Find(&users) return users } func (us *UserService) GetByID(id int) *model.User { user := &model.User{} model.DB.First(user, id) return user } func (us *UserService) Create(user *model.User) { model.DB.Create(user) } func (us *UserService) UpdateByID(id int, user *model.User) { model.DB.Model(&model.User{}).Where("id=?", id).Updates(&user) } func (us *UserService) DeleteByID(id int) { model.DB.Delete(&model.User{}, id) } ``` 4、controller.go: ``` package controller import ( "github.com/kataras/iris/v12" "myproject/model" "myproject/service" "strconv" ) type UserController struct{} func (uc *UserController) GetAll(ctx iris.Context) { userService := &service.UserService{} result := userService.GetAll() ctx.JSON(result) } func (uc *UserController) GetByID(ctx iris.Context) { userService := &service.UserService{} id, _ := strconv.Atoi(ctx.Params().Get("id")) result := userService.GetByID(id) ctx.JSON(result) } func (uc *UserController) Create(ctx iris.Context) { userService := &service.UserService{} user := &model.User{} ctx.ReadJSON(&user) userService.Create(user) } func (uc *UserController) UpdateByID(ctx iris.Context) { userService := &service.UserService{} user := &model.User{} id, _ := strconv.Atoi(ctx.Params().Get("id")) ctx.ReadJSON(&user) userService.UpdateByID(id, user) } func (uc *UserController) DeleteByID(ctx iris.Context) { userService := &service.UserService{} id, _ := strconv.Atoi(ctx.Params().Get("id")) userService.DeleteByID(id) } ``` 5、config.go: ``` package config func GetDSN() string { return "root:123456@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local" } ``` 这是一份基础的代码实现,你可以根据你的需求进行相应的修改和优化。希望对你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值