The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
EminemW

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

  •  
  •   EminemW · Jun 24, 2020 · 5501 views
    This topic created in 2333 days ago, the information mentioned may be changed or developed.
    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()
    

    是不是更有助于理解呢

    Supplement 1  ·  Jun 24, 2020

    单个单词 -> 单个字母

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

    36 replies  •  2020-06-28 09:37:34 +08:00
    ifsclimbing
    ifsclimbing
    Jun 24, 2020
    1
    r 也能理解
    poplar50
    poplar50
    Jun 24, 2020 via Android
    2
    赞同楼主
    Pythondr
    Pythondr
    Jun 24, 2020 via iPhone❤️1
    3
    Golang 提倡的,对于作用域小的局部变量提倡使用单个字符作为变量名
    EminemW
    EminemW
    OP
    Jun 24, 2020
    4
    @Pythondr #3 的确在 Golang 的官方教程中,也有大量出现单个字符做变量名
    EminemW
    EminemW
    OP
    Jun 24, 2020
    5
    @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
    tonyaiken
    Jun 24, 2020
    6
    不易阅读
    iplayio2019
    iplayio2019
    Jun 24, 2020 via Android
    7
    第一层循环用 v,第二层循环用 vv 。各种数据就是 data 。V.V
    neoblackcap
    neoblackcap
    Jun 24, 2020
    8
    golang 官方问题推崇的风格就是这样,循环啥的小作用域都用单变量,反正代表外部不用太关心这个变量。其实这里的 main 函数也是一样。你就是创建一个 router 然后注册对应的 handler 。这个事实也没什么关系,又不用传到别的地方去
    QingXuJiaZhi
    QingXuJiaZhi
    Jun 24, 2020 via Android
    9
    golang 保留了 C 语言的一些习惯,但基本上都有它的道理,没有大问题。
    also24
    also24
    Jun 24, 2020❤️20
    10


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

    ret- return
    ……
    pkaq
    pkaq
    Jun 24, 2020
    19
    楼主先区分一下单词和字母。。。
    kaiki
    kaiki
    Jun 24, 2020
    20
    不是拼音八级都看不懂你的代码.jpg
    garlics
    garlics
    Jun 24, 2020
    21
    @also24 浩强,是你吗?
    yzk66880
    yzk66880
    Jun 24, 2020
    22
    golang 就这德行。。。
    siteshen
    siteshen
    Jun 24, 2020
    23
    恐怕问题不在变量 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
    tiedan
    Jun 24, 2020
    24
    写业务的时候建议不要这样缩写
    QingXuJiaZhi
    QingXuJiaZhi
    Jun 24, 2020
    26
    @siteshen 确实这样改了之后更清晰。不过鉴于现代化 IDE/编辑器已经很普及了(根据 Go 官方调查,绝大部分人都用 vscode 和 goland ),可轻松查看类型,所以不改问题也不大,改了更好。
    hellodudu86
    hellodudu86
    Jun 24, 2020
    27
    如果 import 了一个 router 包,再 router.就容易混淆了
    no1xsyzy
    no1xsyzy
    Jun 24, 2020
    28
    @also24 #10 计数用 c,累加用 s,累乘用 p 或者 q,文件名 fn,打开的文件 fp
    长度可能是 n ( NOIP 一堆长度为 n,因为大 O 基本都是 n ),第二个长度就是 m
    四维数组 wxyz
    uv mapping,连专业术语都是随便找的字母
    Vegetable
    Vegetable
    Jun 24, 2020
    29
    个人认为这种 10 行业内的变量,语义化变量名不是必须的,简洁同样重要。
    别忘了他时有类型信息的,*gin.Engine 也是信息。
    Vegetable
    Vegetable
    Jun 24, 2020
    30
    @Vegetable #29 10 行以内
    ifsclimbing
    ifsclimbing
    Jun 24, 2020
    31
    @EminemW 你这是故意的
    iamwho
    iamwho
    Jun 24, 2020
    32
    先不说规不规范,估计楼主只看了 quick start,下面的 api example 应该是还没看就发帖了。
    EminemW
    EminemW
    OP
    Jun 24, 2020 via iPhone
    33
    @iamwho 那到不至于,我还看了 example 项目
    EminemW
    EminemW
    OP
    Jun 24, 2020
    34
    @siteshen #23 这样的确看一眼就懂了
    neoblackcap
    neoblackcap
    Jun 24, 2020
    35
    @siteshen Default 不是仅仅返回一个 Router,它还自带了一些 Middleware,所以才是 Default,如果只是要一个干净的 router,那么还得用 New
    siteshen
    siteshen
    Jun 28, 2020
    36
    @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.」
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2160 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 11:09 · PVG 19:09 · LAX 03:09 · JFK 06:09
    ♥ Do have faith in what you're doing.