登录
首页 >  Golang >  Go问答

Goland 为什么会对“err”有不同的颜色?

来源:stackoverflow

时间:2024-02-11 18:12:24 441浏览 收藏

大家好,我们又见面了啊~本文《Goland 为什么会对“err”有不同的颜色?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我在 go 中有这段代码:

func Provision(env string) error {
    primaryPath, err := FindPrimaryRegionForEnv(env)
    if err != nil {
        return err
    }
    region := extractRegionFromEnvPath(env, primaryPath)
    if err = ProvisionTableInDynamoDB(env, region); err != nil {
        return err
    }
    return nil
}

goland 的颜色是这样的:

当我将 if err = ... 更改为 if err := ... 时,err 的颜色会发生变化:

绿色的 err 是什么意思?


正确答案


它归结为影子变量在几乎所有类型安全语言中的工作方式。在本例中,绿色 err 意味着您正在重新声明变量而不是更改其值。

goland 费心强调的原因是,在重新声明的范围内,你可能会得到与影子声明相矛盾的值/类型。

package main

import (
    "errors"
    "fmt"
    "reflect"
)

func boolErrType() bool {
    return false
}

func errType() error {
    return errors.New("this is an error")
}

func main() {
    err := boolErrType()
    if !err {
        fmt.Printf("Within boolErrType if condition: %s\n", reflect.TypeOf(err).String())
    }

    if err := errType(); err != nil {
        fmt.Printf("Within errType if condition: %s\n", reflect.TypeOf(err).String())
    }

    fmt.Printf("Within main function: %s\n", reflect.TypeOf(err).String())
}

https://go.dev/play/p/IwDb7iBZYc2

在此示例中,您有两种不同的行为,err 将是 main 块 中的布尔类型。除非它位于 if 条件范围内,否则它将被赋予 错误 类型。

当您开始在错误场景之外使用影子变量时,这主要会受到影响,例如,您可能会将错误的指针传递给导致意外错误的函数。 go 编译器将很难跟踪这些影子变量,并且不会总是在构建时捕获它们。

这可能会在您的生产应用程序中留下意外/未知的错误,然后用户将能够利用这些错误。

这里有一篇关于此的文章可能也有用。 https://nidhi-ag.medium.com/variable-shadowing-in-golang-f500e8e58931

今天关于《Goland 为什么会对“err”有不同的颜色?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>