V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
itoolset
V2EX  ›  程序员

go fmt 为什么强制 8 字符宽度的 tab 缩进?

  •  
  •   itoolset · 2017-03-04 20:50:56 +08:00 · 15038 次点击
    这是一个创建于 2814 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为 golang 的标准库很丰富,想要的模块都内置了所入了坑。。

    但是 go fmt 这个缩进很烦啊,都不能自定义的。

    https://golang.org/cmd/gofmt/

    Gofmt formats Go programs. It uses tabs (width = 8) for indentation and blanks for alignment.

    不会是懒得做选项吧?

    我习惯缩进四个字符宽度=1 个 tab 在 goland IDE 上缩进成这个样子好丑,要是再嵌套个两三层。。

    还有不能导入多余包,不允许无用语句之类的, 感觉很霸道很不讲道理呀这么做

    第 1 条附言  ·  2017-03-04 21:32:31 +08:00
    谢谢大家已经解决, fmt 默认只允许 tab 缩进,默认 tabs (width = 8),但是编辑器显示可以随意设置,
    然后只是觉得他无用代码和包管的有点宽,比如有的时候需要临时加一句测试
    15 条回复    2017-03-06 05:39:35 +08:00
    chingli
        1
    chingli  
       2017-03-04 21:01:59 +08:00
    Go 默认是用 tab 缩进的, 8 字符宽是你你编辑器设置的问题。我记得也可是设为 4 个空格而不是 tab 。
    itoolset
        2
    itoolset  
    OP
       2017-03-04 21:13:43 +08:00
    @chingli go fmt 默认就是
    goofansu
        3
    goofansu  
       2017-03-04 21:17:44 +08:00
    你可以设置编辑器里的 tab 显示成多少个空格,至少 emacs 里是可以的
    xiaq
        4
    xiaq  
       2017-03-04 21:21:09 +08:00 via iPad
    gofmt 实际上用到这个假设的地方是很少的,你在编辑器里把 Tab 宽度设成别的值也没什么影响。这个宽度值多半是 Rob Pike 用的。

    倒入包的问题用 goimports 就能解决。
    chingli
        5
    chingli  
       2017-03-04 21:22:47 +08:00
    @itoolset 以往 go 是可以设置用空格缩进的,现在不行了。详见: https://news.ycombinator.com/item?id=7914523

    不过你缩进 8 个空格位还是因为你编辑器的原因,比如在 .vimrc 中设置: set tabstop=4

    缩进就占 4 个空格位了。
    xiaq
        6
    xiaq  
       2017-03-04 21:26:28 +08:00
    从设计思路上来说, Go 是个自带风格指引( style guide )的语言。

    导入包必须要用、变量必须要用,这些如果出现在风格指引里面,是一点都不过分的。
    itoolset
        7
    itoolset  
    OP
       2017-03-04 21:28:12 +08:00
    @chingli @xiaq
    搞定了 fmt 是没问题了,但是我觉的他这个包和语句管的太宽了
    reus
        8
    reus  
       2017-03-04 21:28:31 +08:00
    go fmt 用 '\t' 缩进。
    一个 '\t' 显示多宽,是你的编辑器的事情,和 go fmt 没有关系。
    统一缩进字符是十分有益的。
    CRVV
        9
    CRVV  
       2017-03-04 21:59:11 +08:00
    @itoolset

    导入一个包会产生副作用,比如 http/pprof 的用法就只是把它 import
    import 一堆不用的包会编译进去一堆不用的东西,还会在启动的时候调用一堆不用的 init 函数,这显然不是 Go 的风格
    Technetiumer
        10
    Technetiumer  
       2017-03-04 22:10:01 +08:00
    tab 本身就是 8 个空格宽啊
    itoolset
        11
    itoolset  
    OP
       2017-03-04 22:37:00 +08:00
    @CRVV 那无用语句呢?
    @Technetiumer 这个看设置的吧,有点默认四空格有的八空格,求可靠参考资料
    gamexg
        12
    gamexg  
       2017-03-05 00:03:39 +08:00
    在项目根目录加个 .editorconfig 文件

    # http://editorconfig.org

    root = true

    [*]
    charset = utf-8
    end_of_line = lf
    insert_final_newline = true
    trim_trailing_whitespace = true

    [*.go]
    indent_style = tab
    indent_size = 4

    [*.tmpl]
    indent_style = tab
    indent_size = 2

    [*.{less,yml}]
    indent_style = space
    indent_size = 2

    [*.js]
    indent_style = space
    indent_size = 4
    Technetiumer
        13
    Technetiumer  
       2017-03-05 14:44:01 +08:00
    @itoolset 我记得 1 个制表符本身就是 8 个空格宽度,而一般都会在编辑器里设置成 1 个制表符 4 个空格宽度

    https://www.zhihu.com/question/19960028/answer/15262434
    http://baike.baidu.com/item/Tab/4023
    https://en.wikipedia.org/wiki/Tab_key
    https://zh.wikipedia.org/wiki/製表鍵
    itoolset
        14
    itoolset  
    OP
       2017-03-05 17:48:56 +08:00
    @Technetiumer
    谢谢长知识了
    afpro
        15
    afpro  
       2017-03-06 05:39:35 +08:00
    go 最讨厌的是 他知道哪些是无用 import 那打包的时候忽略掉就好了 他不 他非让你改 开发的时候好恶心啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:24 · PVG 22:24 · LAX 06:24 · JFK 09:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.