@
neoblackcap 我的回复只是说明 gin 框架没有按照 go 官方推荐的方式组织代码,按我的设想,应该用 NewRouter,DefaultRouter 等含义更清晰的函数名。详细解释如下:
按 go 的官方规范,有区分度的结构体应该是由最后一层 `package + struct name` 组成。举例如下: http.Router, rpc.Request, websocket.Message, router.New(), mux.Default() (其中一些是现编的)等,还有上面有人提到的 gin.Middleware, gin.Engine (虽然不知道 Engine 具体是什么,但可以猜测是某种实体)。
而 gin.New(), gin.Default() 等的返回值是什么?参照对 router.New(), message.New() (分别返回 Router / Message )等的理解,应该是返回一个叫「 Gin 」的东西,而 Gin 是什么呢?我的理解是一个框架,框架名作为实体?这样的代码读起来就很困惑了。
问题出在哪呢? New / Default 不带有任何实体标识符,而实体由 `package + structname` 确定,既然不能用 struct name 来表示类型, 那就应该用 package 的最后一层来表示了。但 gin 这里没有,导致了一部分人对 gin.New(), gin.Default() 这样的代码不明所以。
如果 go 官方代码有最后一层 `package + struct name` 仍然定义不清晰的,欢迎打脸。
https://blog.golang.org/package-names 「 Go code is organized into packages. Within a package, code can refer to any identifier (name) defined within, while clients of the package may only reference the package's exported types, functions, constants, and variables. Such references always include the package name as a prefix: foo.Bar refers to the exported name Bar in the imported package named foo.」