4.2. 局部变量:=作用域

未匹配的标注

现象

写接口写了这样个代码:

func abc(id int64) ([]*model, error) {
    key := "abc"
    cache, err := redis.Get(key).Bytes()
    var res []*model
    if err != nil {
        res, err := service.GetFromDB(id)
        if err != nil {
            return res, err
        }
        redis.Set(key, gostring.JsonEncode(res), 2*time.Minute)
    } else {
        json.Unmarshal(cache, &res)
    }
    return res, nil
}

然后本地测试接口,发现没有命中redis时,res 总是 null,十分奇怪。

Test

仔细看看,你能知道是什么原因吗?


看到文章标题,应该能猜到吧!

我们写个test

package tests

import (
    "errors"
    "testing"
)

func TestVar(t *testing.T) {
    var a int64
    btn := true
    if btn {
        a, err := 2, errors.New("11")
        t.Log("btn", a, err)
    }

    t.Log(a)
}

运行一下,

局部变量

why?

结果看出来了吗?就是因为使用了 := 的缘故,变量在 if 内部才有效,不影响 if 外部变量,修改也就简单了:

...
res, err = service.GetFromDB(id)
...

去掉:即可。

这是使用go的:=需要注意的点,变量作用域需要注意哦!

PS:
:= 只能局部定义,不能在function外定义。


关注和赞赏都是对笔者最大的支持
关注和赞赏都是对笔者最大的支持

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~