V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
EminemW
V2EX  ›  Go 编程语言

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

  •  
  •   EminemW · 2020-06-24 00:43:24 +08:00 · 4279 次点击
    这是一个创建于 1395 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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()
    

    是不是更有助于理解呢

    第 1 条附言  ·  2020-06-24 13:21:53 +08:00

    单个单词 -> 单个字母

    根据大家的评论,得出这是golang提倡的,短作用域尽量用少的字符命名变量?

    36 条回复    2020-06-28 09:37:34 +08:00
    ifsclimbing
        1
    ifsclimbing  
       2020-06-24 00:44:48 +08:00
    r 也能理解
    poplar50
        2
    poplar50  
       2020-06-24 00:47:09 +08:00 via Android
    赞同楼主
    Pythondr
        3
    Pythondr  
       2020-06-24 00:47:36 +08:00 via iPhone   ❤️ 1
    Golang 提倡的,对于作用域小的局部变量提倡使用单个字符作为变量名
    EminemW
        4
    EminemW  
    OP
       2020-06-24 00:57:49 +08:00
    @Pythondr #3 的确在 Golang 的官方教程中,也有大量出现单个字符做变量名
    EminemW
        5
    EminemW  
    OP
       2020-06-24 00:58:39 +08:00
    @ifsclimbing #1
    ```
    func router01() http.Handler {
    e := gin.New()
    e.Use(gin.Recovery())
    e.GET("/", func(c *gin.Context) {
    c.JSON(
    http.StatusOK,
    gin.H{
    "code": http.StatusOK,
    "error": "Welcome server 01",
    },
    )
    })

    return e
    }
    ```
    像这个 e:= gin.New() 呢
    tonyaiken
        6
    tonyaiken  
       2020-06-24 01:00:17 +08:00
    不易阅读
    iplayio2019
        7
    iplayio2019  
       2020-06-24 01:10:21 +08:00 via Android
    第一层循环用 v,第二层循环用 vv 。各种数据就是 data 。V.V
    neoblackcap
        8
    neoblackcap  
       2020-06-24 01:12:00 +08:00
    golang 官方问题推崇的风格就是这样,循环啥的小作用域都用单变量,反正代表外部不用太关心这个变量。其实这里的 main 函数也是一样。你就是创建一个 router 然后注册对应的 handler 。这个事实也没什么关系,又不用传到别的地方去
    cmdOptionKana
        9
    cmdOptionKana  
       2020-06-24 01:36:23 +08:00 via Android
    golang 保留了 C 语言的一些习惯,但基本上都有它的道理,没有大问题。
    also24
        10
    also24  
       2020-06-24 01:47:13 +08:00   ❤️ 20


    临时变量 a b c
    输入数据 d (data)
    标记就用 f (flag)
    全局变量 g (global) ( flask: hhh)
    定义矩形 h w 或者 m n
    长度肯定 l
    遍历下标 i j k
    字典遍历 k v
    字符串 s
    时间 t
    三维数组 x y z

    双指针就 l r 或 s e 或者 h l 或 h t ( left right / start end / high low / head tail )

    多个临时变量就 a1 a2 a3 aa bb cc
    debug 临时变量 wtf cnm mmp why
    noqwerty
        11
    noqwerty  
       2020-06-24 02:09:26 +08:00 via Android
    @also24 怪不得 debug 变量会起这些名字😂
    lxml
        12
    lxml  
       2020-06-24 02:57:14 +08:00 via Android
    看标准库就知道了,准确来说是,这个作用域比较短,十几行以内的用单字母缩写,因为没有什么歧义,作用域比较长的,跨几个函数或者单函数比较大的,还是会用全称。
    mlboy
        13
    mlboy  
       2020-06-24 05:57:08 +08:00 via iPhone   ❤️ 1
    这正是符合规范,golang 就是提倡你的变量长度根据你的使用率决定,
    Weny
        14
    Weny  
       2020-06-24 06:20:04 +08:00 via iPhone
    一开始确实会有一些不习惯 后面就是一直缩写一直爽 hhh
    chotow
        15
    chotow  
       2020-06-24 07:03:16 +08:00 via iPhone   ❤️ 1
    @EminemW #5 e 是 engine 的首字母
    mxalbert1996
        16
    mxalbert1996  
       2020-06-24 08:17:24 +08:00
    楼主先区分一下单词和字母。。。
    David1119
        17
    David1119  
       2020-06-24 08:23:00 +08:00
    @also24 debug 亮了,笑出声~
    dog82
        18
    dog82  
       2020-06-24 08:29:53 +08:00
    i - index / iterator
    r - result / router
    l - list
    a - array

    ret- return
    ……
    pkaq
        19
    pkaq  
       2020-06-24 08:31:39 +08:00
    楼主先区分一下单词和字母。。。
    kaiki
        20
    kaiki  
       2020-06-24 08:41:02 +08:00
    不是拼音八级都看不懂你的代码.jpg
    garlics
        21
    garlics  
       2020-06-24 09:08:51 +08:00
    @also24 浩强,是你吗?
    yzk66880
        22
    yzk66880  
       2020-06-24 09:55:30 +08:00
    golang 就这德行。。。
    siteshen
        23
    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
        24
    tiedan  
       2020-06-24 10:04:08 +08:00
    写业务的时候建议不要这样缩写
    cmdOptionKana
        26
    cmdOptionKana  
       2020-06-24 10:46:58 +08:00
    @siteshen 确实这样改了之后更清晰。不过鉴于现代化 IDE/编辑器已经很普及了(根据 Go 官方调查,绝大部分人都用 vscode 和 goland ),可轻松查看类型,所以不改问题也不大,改了更好。
    hellodudu86
        27
    hellodudu86  
       2020-06-24 11:17:31 +08:00
    如果 import 了一个 router 包,再 router.就容易混淆了
    no1xsyzy
        28
    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
        29
    Vegetable  
       2020-06-24 12:36:28 +08:00
    个人认为这种 10 行业内的变量,语义化变量名不是必须的,简洁同样重要。
    别忘了他时有类型信息的,*gin.Engine 也是信息。
    Vegetable
        30
    Vegetable  
       2020-06-24 12:37:31 +08:00
    @Vegetable #29 10 行以内
    ifsclimbing
        31
    ifsclimbing  
       2020-06-24 12:52:07 +08:00
    @EminemW 你这是故意的
    iamwho
        32
    iamwho  
       2020-06-24 12:59:28 +08:00
    先不说规不规范,估计楼主只看了 quick start,下面的 api example 应该是还没看就发帖了。
    EminemW
        33
    EminemW  
    OP
       2020-06-24 13:09:38 +08:00 via iPhone
    @iamwho 那到不至于,我还看了 example 项目
    EminemW
        34
    EminemW  
    OP
       2020-06-24 13:16:08 +08:00
    @siteshen #23 这样的确看一眼就懂了
    neoblackcap
        35
    neoblackcap  
       2020-06-24 14:01:43 +08:00
    @siteshen Default 不是仅仅返回一个 Router,它还自带了一些 Middleware,所以才是 Default,如果只是要一个干净的 router,那么还得用 New
    siteshen
        36
    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.」
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1439 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:55 · PVG 07:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.