Golang Go语言中包名不同,引入相同名称的结构体报错,找 Golang Go语言大佬指教
Golang Go语言中包名不同,引入相同名称的结构体报错,找 Golang Go语言大佬指教
错误信息
# github.com/study/gincms/router
duplicate "".(*IndexController).Index-fm.stkobj
<autogenerated>:1: symbol "".(*IndexController).Index-fm.stkobj listed multiple times
golang 版本
go version go1.12.1 windows/amd64
业务代码截图
package router
import ( “github.com/study/gincms/controller/admin” “github.com/study/gincms/controller/home” “github.com/gin-gonic/gin” )
/** 路由初始化 */ func RouterInit() *gin.Engine {
r := gin.Default() //前台 API 路由 homeIndex := new(home.IndexController) r.GET("/", homeIndex.Index) homeUrl := r.Group("/home") { homeUrl.GET("/index/index", homeIndex.Index) } //后台 API 路由 index := new(admin.IndexController) adminUrl := r.Group("/admin") { adminUrl.GET("/index/index", index.Index) } return r
}
controller
package admin
import ( “net/http” “github.com/gin-gonic/gin” )
type IndexController struct{}
func (this *IndexController) Index(ctx *gin.Context) { ctx.JSON( http.StatusOK, gin.H{ “message”: “111”, }) }
package home
import ( “net/http” “github.com/gin-gonic/gin” )
type IndexController struct{}
func (this *IndexController) Index(ctx *gin.Context) { ctx.JSON( http.StatusOK, gin.H{ “message”: “2222”, }) }
我觉得还是改名字吧。。。。HomeController, AdminController、
更多关于Golang Go语言中包名不同,引入相同名称的结构体报错,找 Golang Go语言大佬指教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
测试了一下,gin 框架下面,如果是不同包同名的 struct,方法名不同也可以运行。不知道是不是 gin 解析路由有什么特别的要求
逻辑上是不应该冲突的,都不在一个包了
嗯测试了 应该是 gin 哪里没用对,不用 gin 是可以的
编译器的 bug
<br>package router<br><br>import (<br> cAdmin "<a target="_blank" href="http://github.com/study/gincms/controller/admin" rel="nofollow noopener">github.com/study/gincms/controller/admin</a>"<br> cIndex "<a target="_blank" href="http://github.com/study/gincms/controller/home" rel="nofollow noopener">github.com/study/gincms/controller/home</a>"<br> "<a target="_blank" href="http://github.com/gin-gonic/gin" rel="nofollow noopener">github.com/gin-gonic/gin</a>"<br>)<br>
用别名啊。
在Golang中,如果不同包中引入了相同名称的结构体,通常不会导致直接的编译错误,除非存在命名冲突或导入路径问题。以下是一些可能的解决方案和建议:
- 检查包名和导入路径:确保每个包的命名与其目录名一致,并且导入路径正确无误。例如,如果结构体位于
models
包中,确保导入路径为import "path/to/your/project/models"
。 - 使用别名:如果两个包中都有相同名称的结构体,并且你需要在同一个文件中同时使用它们,可以通过为导入的包指定别名来解决命名冲突。例如:
import (
mod1 "path/to/module1"
mod2 "path/to/module2"
)
func main() {
var s1 mod1.MyStruct
var s2 mod2.MyStruct
}
- 检查结构体名称:确认你要使用的结构体名称在两个包中是否确实相同,以及是否有必要重命名其中一个以避免混淆。
- 编译和运行:确保你的项目已经正确初始化Go modules(执行
go mod init
),并在项目根目录下编译和运行代码(使用go run .
或go build
)。
遵循以上建议,你应该能够解决因包名不同但引入相同名称结构体而导致的报错问题。如果问题依旧存在,请检查具体的错误信息以获取更多线索。