image-20201224162811056

复现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import "errors"

func main() {
	TestErr("go", "golang")
}

func TestErr(t, p string) (s string, err error) {
	switch t {
	case "go":
		err := check(p)
		if err != nil {
			// 返回参数里的 err 作用域是整个函数,即外层作用域
			// check 返回的 err 作用域是 switch 范围.即内层作用域.
			// return 操作,不指明是将内层作用域 返回给外层作用域, 这样在 go 里是不允许的.
			return
		}
	}
	return
}
func check(s string) error {
	if s == "hello" {
		return nil
	}
	return errors.New("s is not hello")
}

以上代码运行后会报err is shadowed during return 错误. 主要原因就是不同的作用域不能直接返回.而需要在return 后面跟上返回的参数才行

将上面的TestErr 改为以下形式即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func TestErr(t, p string) (s string, err error) {
	switch t {
	case "go":
		err := check(p)
		if err != nil {
            // 在 return 后面后跟指定参数返回. 就不会报错啦.
			return "", err
		}
	}
	return
}

结论

  1. golang 函数里, 同一级别的作用域可以直接通过 return 返回
  2. golang 函数里, 不同级另的作用域只能在 return 后指定参数返回