golang自动缩短Go代码行长度的格式化插件golines的使用

Golang自动缩短Go代码行长度的格式化插件golines的使用

简介

Golines是一个Go代码格式化工具,除了完成gofmt的所有格式化修复外,还能缩短长代码行。标准Go格式化工具(gofmtgoimports等)故意不缩短长行,而golines提供了这个功能。

安装

对于Go 1.21或更新版本:

go install github.com/segmentio/golines@latest

对于旧版Go:

go install github.com/segmentio/golines@v0.9.0

基本使用

golines [要格式化的路径]

路径可以是目录或单个文件。如果没有提供路径,则从stdin读取输入(与gofmt相同)。默认结果输出到stdout,要覆盖原文件,使用-w标志。

示例对比

格式化前

myMap := map[string]string{"first key": "first value", "second key": "second value", "third key": "third value", "fourth key": "fourth value", "fifth key": "fifth value"}

格式化后

myMap := map[string]string{
    "first key": "first value",
    "second key": "second value",
    "third key": "third value",
    "fourth key": "fourth value",
    "fifth key": "fifth value",
}

主要选项

行长度设置

  • -m: 设置最大行长度(默认100)
  • -t: 设置tab代表的空格数(默认4)

其他常用选项

  • --dry-run: 显示git风格的差异而不修改文件
  • --shorten-comments: 启用缩短注释行(默认关闭)
  • --no-reformat-tags: 关闭结构体标签重新格式化
  • --ignore-generated=false: 格式化生成的代码文件

开发工具集成

vim-go配置

let g:go_fmt_command = "golines"
let g:go_fmt_options = {
    \ 'golines': '-m 128',
    \ }

VS Code配置

  1. 安装Run on Save扩展
  2. 在settings.json中添加:
"emeraldwalk.runonsave": {
    "commands": [
        {
            "match": "\\.go$",
            "cmd": "golines ${file} -w"
        }
    ]
}

Goland配置

  1. 创建新的文件监视器
  2. 设置:
    • 名称: golines
    • 文件类型: Go files
    • 范围: Project Files
    • 程序: golines
    • 参数: $FilePath$ -w
    • 输出路径刷新: $FilePath$

工作原理

  1. 读取文件并分成行
  2. 为超过最大长度的行添加特殊注释
  3. 使用装饰语法树库解析代码
  4. 遍历树查找带注释的节点
  5. 缩短长行节点
  6. 重复直到无法再缩短
  7. 运行基础格式化器并输出结果

局限性

虽然golines已经过多种输入测试,但并不完美。特别是对长注释行的处理还有改进空间。


更多关于golang自动缩短Go代码行长度的格式化插件golines的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang自动缩短Go代码行长度的格式化插件golines的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


golines - Go代码行长度自动格式化工具

golines 是一个用于自动缩短Go代码行长度的格式化工具,它可以自动将过长的Go代码行按照最佳实践拆分成多行,保持代码整洁和可读性。

安装golines

go install github.com/segmentio/golines@latest

安装完成后,golines 命令将被安装到 $GOPATH/bin 目录下。

基本使用

格式化单个文件

golines -w yourfile.go

-w 标志表示直接修改文件内容。

格式化整个目录

golines -w ./...

查看格式化差异而不修改文件

golines yourfile.go

这会显示格式化前后的差异,但不会实际修改文件。

主要功能选项

  1. 设置最大行长度 (默认80字符)

    golines -w --max-len=100 yourfile.go
    
  2. 忽略特定文件或目录

    golines -w --ignore="testdata/*,vendor/*" ./...
    
  3. 仅处理长行 (不重新格式化其他内容)

    golines -w --no-reformat-tags --no-reformat-funcs yourfile.go
    
  4. 保留原始注释格式

    golines -w --no-rewrite-comments yourfile.go
    

示例

格式化前

package main

import ("fmt"; "strings"; "os"; "github.com/some/long/import/path")

func veryLongFunctionName(param1 string, param2 int, param3 bool, param4 []byte, param5 map[string]interface{}) (result string, err error) {
    if param3 && len(param4) > 0 || param2 > 100 && strings.Contains(param1, "special") {
        result = fmt.Sprintf("Complex condition: %s %d %v %v", param1, param2, param3, param5["key"])
    }
    return
}

格式化后

package main

import (
    "fmt"
    "os"
    "strings"
    
    "github.com/some/long/import/path"
)

func veryLongFunctionName(
    param1 string,
    param2 int,
    param3 bool,
    param4 []byte,
    param5 map[string]interface{},
) (result string, err error) {
    if param3 && len(param4) > 0 ||
        param2 > 100 &&
        strings.Contains(param1, "special") {
        result = fmt.Sprintf(
            "Complex condition: %s %d %v %v",
            param1,
            param2,
            param3,
            param5["key"],
        )
    }
    return
}

与gofmt/goimports配合使用

golines 可以与其他Go格式化工具配合使用,建议的工作流程:

gofmt -w yourfile.go      # 基础格式化
goimports -w yourfile.go  # 整理imports
golines -w yourfile.go    # 处理长行

在CI/CD中集成

可以在CI流程中添加golines检查:

if golines -l . | grep .; then
    echo "Some lines are too long"
    golines -l .
    exit 1
fi

自定义配置

可以在项目根目录创建 .golines 文件进行配置:

{
    "max_len": 100,
    "ignore": ["testdata/*", "vendor/*"],
    "no_reformat_tags": true
}

注意事项

  1. golines 不会改变代码的逻辑,只改变代码的呈现形式
  2. 对于特别复杂的代码结构,可能需要手动调整
  3. 建议在团队中统一行长度限制标准
  4. goimports 配合使用时,建议先运行 goimports 再运行 golines

golines 是保持Go代码整洁和一致性的有用工具,特别适合大型项目和团队协作环境。

回到顶部