一尘不染

Go中的可变阴影

go

以下代码生成编译错误:“已声明并未使用err”。如果这里存在范围/阴影问题,那是由于我不了解的原理。有人可以解释吗?

package main

import (
    "fmt"
)

func main() {
    var (
        err error
        dto = make(map[string]interface{})
    )

    dto[`thing`],err = getThings();
    fmt.Println(dto[`thing`]);
}

func getThings() (string,error) {
    return `the thing`,nil
}

阅读 269

收藏
2020-07-02

共1个答案

一尘不染

这不是因为有任何阴影。err除了为变量赋值之外,您没有使用任何声明的变量。

根据常见问题

未使用的变量的存在可能表明存在错误,而未使用的导入只会减慢编译速度。在代码树中积累足够的未使用导入,事情可能会变得很慢。由于这些原因,Go不允许

如果声明变量,则必须使用

在给定的程序err中声明并用于将数据分配给。err根本不使用的值

您可以通过执行_赋值来避免此类错误

  var _ = err

或使用err喜欢

  if err != nil {
      fmt.Println(err.Error())
      return
  }

以下代码可以解决问题,但我建议使用err检查错误

package main

import (
    "fmt"
)

func main() {
    var (
        err error
        dto = make(map[string]interface{})
    )
    _ = err

    dto[`thing`], err = getThings()
    fmt.Println(dto[`thing`])
}

func getThings() (string, error) {
    return `the thing`, nil
}

PS: 你必须使用你声明在函数内部的变量,但它的 ,如果你有未使用的全局变量。也可以使用未使用的函数参数。

2020-07-02