gin 官方文档的示例代码,变量命名为何要使用单个单词,看起来很不顺眼,是不是不符合代码规范。如`r := gin.Default()`

2020-06-24 00:43:24 +08:00
 EminemW
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

其中

r := gin.Default()

改成

router := gin.Default()

是不是更有助于理解呢

4309 次点击
所在节点    Go 编程语言
36 条回复
garlics
2020-06-24 09:08:51 +08:00
@also24 浩强,是你吗?
yzk66880
2020-06-24 09:55:30 +08:00
golang 就这德行。。。
siteshen
2020-06-24 10:02:49 +08:00
恐怕问题不在变量 r,而是在 API gin.Default 上,听过没用过 gin 的根本不知道 Default 返回值是什么。
r := gin.DefaultRouter() 这样是不是就比较容易懂了?(没看过 gin 源码,姑且认为返回的是叫 Router 的东西)

给几个我觉得不错的 API 命名供参考:

net/http.DefaultServeMux
github.com/go-chi/chi.NewRouter()
github.com/gorilla/mux.NewRouter()
tiedan
2020-06-24 10:04:08 +08:00
写业务的时候建议不要这样缩写
Pythondr
2020-06-24 10:38:59 +08:00
cmdOptionKana
2020-06-24 10:46:58 +08:00
@siteshen 确实这样改了之后更清晰。不过鉴于现代化 IDE/编辑器已经很普及了(根据 Go 官方调查,绝大部分人都用 vscode 和 goland ),可轻松查看类型,所以不改问题也不大,改了更好。
hellodudu86
2020-06-24 11:17:31 +08:00
如果 import 了一个 router 包,再 router.就容易混淆了
no1xsyzy
2020-06-24 12:32:45 +08:00
@also24 #10 计数用 c,累加用 s,累乘用 p 或者 q,文件名 fn,打开的文件 fp
长度可能是 n ( NOIP 一堆长度为 n,因为大 O 基本都是 n ),第二个长度就是 m
四维数组 wxyz
uv mapping,连专业术语都是随便找的字母
Vegetable
2020-06-24 12:36:28 +08:00
个人认为这种 10 行业内的变量,语义化变量名不是必须的,简洁同样重要。
别忘了他时有类型信息的,*gin.Engine 也是信息。
Vegetable
2020-06-24 12:37:31 +08:00
@Vegetable #29 10 行以内
ifsclimbing
2020-06-24 12:52:07 +08:00
@EminemW 你这是故意的
iamwho
2020-06-24 12:59:28 +08:00
先不说规不规范,估计楼主只看了 quick start,下面的 api example 应该是还没看就发帖了。
EminemW
2020-06-24 13:09:38 +08:00
@iamwho 那到不至于,我还看了 example 项目
EminemW
2020-06-24 13:16:08 +08:00
@siteshen #23 这样的确看一眼就懂了
neoblackcap
2020-06-24 14:01:43 +08:00
@siteshen Default 不是仅仅返回一个 Router,它还自带了一些 Middleware,所以才是 Default,如果只是要一个干净的 router,那么还得用 New
siteshen
2020-06-28 09:37:34 +08:00
@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.」

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/684298

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX