gopls版本
golang.org/x/tools/gopls v0.15.2
go env
.
你做了什么?
在 // selection start
和 // selection end
包围的代码块上执行提取函数代码操作。
func F() error {
// selection start
a, err := json.Marshal(0)
if err != nil {
return fmt.Errorf("1: %w", err)
}
b, err := json.Marshal(0)
if err != nil {
return fmt.Errorf("2: %w", err)
}
// selection end
fmt.Println(a, b)
return nil
}
你看到了什么?
func F() error {
// selection start
a, b, shouldReturn, returnValue := newFunction()
if shouldReturn {
return returnValue
}
// selection end
fmt.Println(a, b)
return nil
}
func newFunction() ([]byte, []byte, bool, error) {
a, err := json.Marshal(0)
if err != nil {
return nil, nil, true, fmt.Errorf("2: %w", err)
}
b, err := json.Marshal(0)
if err != nil {
return nil, nil, true, fmt.Errorf("2: %w", err)
}
return a, b, false, nil
}
你期望看到什么?
func F() error {
// selection start
a, b, err := newFunction()
if err != nil {
return err
}
// selection end
fmt.Println(a, b)
return nil
}
func newFunction() ([]byte, []byte, error) {
a, err := json.Marshal(0)
if err != nil {
return nil, nil, fmt.Errorf("2: %w", err)
}
b, err := json.Marshal(0)
if err != nil {
return nil, nil, fmt.Errorf("2: %w", err)
}
return a, b, nil
}
启发式方法是当选择中的每个返回语句都是错误处理返回时的特殊情况。详细启发式:
让 f 成为作用域中具有错误返回值作为最后一个返回值的函数。特殊情况是,如果每个返回语句的形式为 return zeros..., expr
,其中 expr
是已知的非空值。在这种情况下,修改后的调用站点为 values..., err := newFunction(...); if err != nil { return zeros..., err }
,提取的函数应在此末尾添加一个 return values..., nil
。
此重构将返回与之前相同的值,因为当它确实返回时,值是正确的,而当它确实不返回时,if err != nil
将确保不会执行 return 语句。
编辑器和设置
- 无响应*
日志
- 无响应*
1条答案
按热度按时间niknxzdl1#
同意。我们正在努力改进重构,并将修复这个问题。