Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go语言格式化代码

Go语言使用goimports格式化代码的完整教学

作者:lewis_lk

goimports 是 Go 语言中一个非常常用的工具,用于自动格式化 Go 源代码并管理 import 声明,下面小编就和大家详细介绍一下如何使用goimports进行格式化代码吧

goimports简介

goimports 是 Go 语言中一个非常常用的工具,用于自动格式化 Go 源代码管理 import 声明。它是 go fmt 命令的增强版,除了格式化代码外,还会自动添加缺失的包导入和删除未使用的包导入。

安装

go install golang.org/x/tools/cmd/goimports@latest

用法

# 格式化单个文件并输出到标准输出
goimports file.go

# 格式化并替换原文件
goimports -w file.go

# 格式化整个目录
goimports -w ./...

# 显示差异而不修改文件
goimports -d file.go

# 从标准输入读取,输出到标准输出
cat file.go | goimports

推荐方式:使用gopls(默认且官方推荐)

VsCode的Go插件从v0.24.0 起,gopls 已内置 goimports 功能,无需单独安装 goimports。你只需启用相关设置即可。

常见问题

独立块没有被合并

例如,下面这段代码用goimports格式化并不会有变化

package main

import (
	"fmt"

	"github.com/sirupsen/logrus"

	"net/http"
)

func main() {
	fmt.Println("hello")
	http.ListenAndServe(":8080", nil)
	logrus.Info("started")
}

原因分析

goimports 是按 import 块(block)来处理的,而不是“全局重排所有 imports” 。 代码中,imports 被写成了 三个独立的 import 块

import "fmt" // 块1 
import "github.com/..." // 块2 
import "net/http" // 块3

在 Go 语法中,这种写法等价于:

import (
    "fmt"
)

import (
    "github.com/sirupsen/logrus"
)

import (
    "net/http"
)

而 goimports 默认不会合并多个 import (...) 块!它只会在同一个 import 块内进行排序和分组。

解决方案

本地包命名不规范,导致没有被格式化 例如,下面这段代码用goimports格式化并不会有变化

package main

import (
	"fmt"
	"hello-go/show"
	"time"
)

func main() {
	fmt.Println(time.Now().Format(time.TimeOnly))
	fmt.Println(show.Show("hello"))
}

本地包命名不规范,导致没有被格式化

例如,下面这段代码用goimports格式化并不会有变化

package main

import (
	"fmt"
	"hello-go/show"
	"time"
)

func main() {
	fmt.Println(time.Now().Format(time.TimeOnly))
	fmt.Println(show.Show("hello"))
}

原因分析

核心原因:模块路径不规范

Go 的 import 分组依赖于 模块(module)的完整路径。而 "hello-go/show" 是一个 不带域名的路径goimports 无法判断它是:

由于它不符合标准库规则,也不以 github.com/... 等形式出现,goimports 默认将其视为“未知第三方包” ,并和标准库混在一起(或排序混乱)。

解决方案

Go 官方推荐使用伪域名(如 example.com/yourproj)避免与未来第三方包冲突。

配置 goimports 识别本地模块

{
    "gopls": {
        "formatting.local": "hello-go"
    },
}

到此这篇关于Go语言使用goimports格式化代码的完整教学的文章就介绍到这了,更多相关Go语言格式化代码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文