do not define dynamic errors, use wrapped static errors instead: "fmt.Errorf("docker image is not set")" (err113) #356
CarlJi
started this conversation in
Show and tell
Replies: 1 comment 1 reply
-
如果我这个错误,只出现一次,为此还单独定义变量,会不会太麻烦了? |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
这个警告提醒你不要定义动态错误,而是应该使用静态错误并通过错误包装来处理错误。
背景
在 Go 语言中,我们可以通过
fmt.Errorf
动态创建错误,尤其是带有格式化字符串的错误信息。然而,对于一些固定的错误信息,不建议每次都动态生成新的错误对象。相反,应该使用预定义的、可复用的静态错误(通常是一个包级别的var
错误变量),并在需要时对错误进行包装或附加上下文。原因
复用和比较:在 Go 中,通过
errors.Is
或直接比较错误值,可以轻松判断错误的类型。如果每次都通过fmt.Errorf
动态生成错误对象,那么这些错误对象是不同的,无法直接进行比较。性能:静态错误的内存分配只会发生一次,而动态生成的错误会在每次生成时分配新的内存,增加不必要的开销。
可读性:使用静态错误可以让代码更加简洁和可维护,因为常见的错误可以在包级别定义并复用。
示例
错误的做法(动态错误)
这种方式会每次生成一个新的错误对象,导致错误无法复用和比较。
正确的做法(使用静态错误)
你可以定义一个静态的错误变量,然后在需要时用它来表示特定类型的错误:
这样做有几个好处:
复用:
ErrDockerImageNotSet
是静态定义的,可以在不同的地方复用。比较:可以通过
errors.Is
或直接比较来判断错误类型:包装错误以增加上下文信息
如果你想使用静态错误并且还想在错误中附加一些上下文信息,可以使用
fmt.Errorf
和"%w"
语法来包装静态错误,而不是动态生成新的错误:在这个例子中,我们保留了静态错误
ErrDockerImageNotSet
,并通过%w
包装错误,保持了错误可比较的特性,同时附加了上下文信息"failed to start container"
。总结
fmt.Errorf("docker image is not set")
是一种动态错误的创建方式,每次都会生成新的错误对象。errors.New
或var
定义的全局错误变量,便于复用和比较。fmt.Errorf
和"%w"
包装静态错误,而不是直接创建新的动态错误。因此,
err113
的意思是:不要使用动态生成的错误,而应定义静态错误并在需要时进行包装。Beta Was this translation helpful? Give feedback.
All reactions